import { ChangeDetectorRef, Component } from '@angular/core'; import { NgFlutterComponent } from './ng-flutter/ng-flutter.component'; import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; import { MatSidenavModule } from '@angular/material/sidenav'; import { CommonModule } from '@angular/common'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatIconModule } from '@angular/material/icon'; import { MatListModule } from '@angular/material/list'; import { MatCardModule } from '@angular/material/card'; import { MatSliderModule } from '@angular/material/slider'; import { MatButtonModule } from '@angular/material/button'; import { MatSelectModule } from '@angular/material/select'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; @Component({ standalone: true, selector: 'app-root', template: ` menu Angular 🤝 Flutter flutter_dash Effects Shadow Mirror Resize Spin JS Interop Screen Counter TextField Custom App @if (this.flutterState?.getScreen() === 'counter') { Clicks } @else { Text @if (this.flutterState?.getText()) { close } } `, styles: [` :host{ display: flex; height: 100%; flex-direction: column; } .toolbar-spacer { flex: 1 1 auto; } .sidenav-container { flex: 1; } .sidenav { width: 300px; padding: 10px; } .button-list { display: flex; flex-wrap: wrap; gap: 5px; margin-bottom: 20px; } .button-list button { min-width: 130px; } .sidenav-content { display: flex; justify-content: center; align-items: center; } .flutter-app { border: 1px solid #eee; border-radius: 5px; height: 480px; width: 320px; transition: all 150ms ease-in-out; overflow: hidden; } `], imports: [ NgFlutterComponent, MatToolbarModule, MatSidenavModule, MatSidenavModule, MatIconModule, CommonModule, MatListModule, MatCardModule, MatSliderModule, MatButtonModule, MatFormFieldModule, MatSelectModule, MatInputModule, ], }) export class AppComponent { title = 'ng-flutter'; flutterState?: any; constructor(private changeDetectorRef: ChangeDetectorRef, private breakpointObserver: BreakpointObserver) { } onFlutterAppLoaded(state: any) { this.flutterState = state; this.flutterState.onClicksChanged(() => { this.onCounterChanged() }); this.flutterState.onTextChanged(() => { this.onTextChanged() }); } onCounterSet(event: Event) { let clicks = parseInt((event.target as HTMLInputElement).value, 10) || 0; this.flutterState.setClicks(clicks); } onTextSet(event: Event) { this.flutterState.setText((event.target as HTMLInputElement).value || ''); } // I need to force a change detection here. When clicking on the "Decrement" // button, everything works fine, but clicking on Flutter doesn't trigger a // repaint (even though this method is called) onCounterChanged() { this.changeDetectorRef.detectChanges(); } onTextChanged() { this.changeDetectorRef.detectChanges(); } }