From 88243a65a90757731bf87b25d9e4250f23c7cf2a Mon Sep 17 00:00:00 2001 From: Khanh Nguyen Date: Tue, 2 Dec 2025 00:24:21 -0800 Subject: [PATCH 1/3] Fix unneccessary full rebuilds when resizing window --- .../lib/flutter_firebase_ai_demo.dart | 57 +++++++++---------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/firebase_ai_logic_showcase/lib/flutter_firebase_ai_demo.dart b/firebase_ai_logic_showcase/lib/flutter_firebase_ai_demo.dart index b14aa79..a6fd689 100644 --- a/firebase_ai_logic_showcase/lib/flutter_firebase_ai_demo.dart +++ b/firebase_ai_logic_showcase/lib/flutter_firebase_ai_demo.dart @@ -59,30 +59,11 @@ class _DemoHomeScreenState extends State { Widget build(BuildContext context) { return LayoutBuilder( builder: (context, constraints) { - if (constraints.maxWidth < 600) { - // Use BottomNavigationBar for smaller screens - return Scaffold( - body: demoPages[_selectedIndex], - bottomNavigationBar: BottomNavigationBar( - type: BottomNavigationBarType.fixed, - items: destinations - .map( - (e) => BottomNavigationBarItem( - icon: e.icon, - label: e.label, - activeIcon: e.selectedIcon, - ), - ) - .toList(), - currentIndex: _selectedIndex, - onTap: _onItemTapped, - ), - ); - } else { - // Use NavigationRail for larger screens - return Scaffold( - body: Row( - children: [ + return Scaffold( + body: Row( + children: [ + if (constraints.maxWidth > + 600) // Show NavigationRail on Medium or larger screens NavigationRail( selectedIndex: _selectedIndex, onDestinationSelected: _onItemTapped, @@ -101,12 +82,28 @@ class _DemoHomeScreenState extends State { ) .toList(), ), - const VerticalDivider(thickness: 1, width: 1), - Expanded(child: demoPages[_selectedIndex]), - ], - ), - ); - } + Expanded(child: demoPages[_selectedIndex]), + ], + ), + bottomNavigationBar: + (constraints.maxWidth < + 600) // Show navigation bar on smaller screens + ? BottomNavigationBar( + type: BottomNavigationBarType.fixed, + items: destinations + .map( + (e) => BottomNavigationBarItem( + icon: e.icon, + label: e.label, + activeIcon: e.selectedIcon, + ), + ) + .toList(), + currentIndex: _selectedIndex, + onTap: _onItemTapped, + ) + : null, + ); }, ); } From 7524832a431a027fd3efed60b2373f3f659d5e0d Mon Sep 17 00:00:00 2001 From: Khanh Nguyen Date: Tue, 2 Dec 2025 00:49:42 -0800 Subject: [PATCH 2/3] Add back Blaze Warning in Nano banana demo without using the redundant model picker. --- .../lib/demos/chat_nano/chat_nano_demo.dart | 49 ++++++++----------- .../lib/shared/ui/blaze_warning.dart | 5 +- 2 files changed, 22 insertions(+), 32 deletions(-) diff --git a/firebase_ai_logic_showcase/lib/demos/chat_nano/chat_nano_demo.dart b/firebase_ai_logic_showcase/lib/demos/chat_nano/chat_nano_demo.dart index 1ebabb3..d238179 100644 --- a/firebase_ai_logic_showcase/lib/demos/chat_nano/chat_nano_demo.dart +++ b/firebase_ai_logic_showcase/lib/demos/chat_nano/chat_nano_demo.dart @@ -22,14 +22,13 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:image_picker/image_picker.dart'; import '../../shared/ui/app_frame.dart'; import '../../shared/ui/app_spacing.dart'; +import '../../shared/ui/blaze_warning.dart'; import '../../shared/ui/chat_components/ui_components.dart'; import '../../shared/chat_service.dart'; -import '../../shared/ui/chat_components/model_picker.dart'; import '../../shared/models/models.dart'; class ChatDemoNano extends ConsumerStatefulWidget { - const ChatDemoNano({super.key, this.isSelected = false}); - final bool isSelected; + const ChatDemoNano({super.key}); @override ConsumerState createState() => ChatDemoNanoState(); @@ -47,7 +46,7 @@ class ChatDemoNanoState extends ConsumerState { final ScrollController _scrollController = ScrollController(); bool _loading = false; OverlayPortalController opController = OverlayPortalController(); - static bool _pickerHasBeenShown = false; + static bool _warningHasBeenShown = false; @override void initState() { @@ -57,23 +56,15 @@ class ChatDemoNanoState extends ConsumerState { _chatService.init(); _userTextInputController.text = 'Hot air balloons rising over the San Francisco Bay at golden hour with a view of the Golden Gate Bridge. Make it anime style.'; - _checkAndShowPicker(); + _checkAndShowBlazeWarning(); } - @override - void didUpdateWidget(ChatDemoNano oldWidget) { - super.didUpdateWidget(oldWidget); - if (widget.isSelected != oldWidget.isSelected) { - _checkAndShowPicker(); - } - } - - void _checkAndShowPicker() { - if (widget.isSelected && !_pickerHasBeenShown) { - _pickerHasBeenShown = true; + void _checkAndShowBlazeWarning() { + if (!_warningHasBeenShown) { + _warningHasBeenShown = true; WidgetsBinding.instance.addPostFrameCallback((_) { if (mounted) { - showModelPicker(); + showBlazeWarning(); } }); } @@ -182,20 +173,22 @@ class ChatDemoNanoState extends ConsumerState { } } - void showModelPicker() { + void showBlazeWarning() { showDialog( context: context, builder: (context) { - return ModelPicker( - selectedModel: geminiModels.selectedModel, - onSelected: (value) { - _chatService.changeModel(value); - setState(() { - _userTextInputController.text = - geminiModels.selectedModel.defaultPrompt; - _messages.clear(); - }); - }, + return Dialog( + backgroundColor: Theme.of(context).colorScheme.surfaceContainerLow, + child: ConstrainedBox( + constraints: BoxConstraints(maxWidth: 600), + child: Padding( + padding: const EdgeInsets.all(AppSpacing.s16), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [BlazeWarning()], + ), + ), + ), ); }, ); diff --git a/firebase_ai_logic_showcase/lib/shared/ui/blaze_warning.dart b/firebase_ai_logic_showcase/lib/shared/ui/blaze_warning.dart index 3b23bfb..cf9f875 100644 --- a/firebase_ai_logic_showcase/lib/shared/ui/blaze_warning.dart +++ b/firebase_ai_logic_showcase/lib/shared/ui/blaze_warning.dart @@ -40,10 +40,7 @@ class BlazeWarning extends StatelessWidget { ), TextSpan(text: '.'), TextSpan(text: '\n\n'), - TextSpan( - text: - 'Eligible developers can claim ', - ), + TextSpan(text: 'Eligible developers can claim '), WidgetSpan( baseline: TextBaseline.ideographic, alignment: PlaceholderAlignment.top, From 2d67629dfccc6638b8fe8de94ea2b693ddab41c2 Mon Sep 17 00:00:00 2001 From: Khanh Nguyen Date: Tue, 2 Dec 2025 01:01:55 -0800 Subject: [PATCH 3/3] add firebase ai logic logo and divider to navigation rail --- .../lib/flutter_firebase_ai_demo.dart | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/firebase_ai_logic_showcase/lib/flutter_firebase_ai_demo.dart b/firebase_ai_logic_showcase/lib/flutter_firebase_ai_demo.dart index a6fd689..d9fde64 100644 --- a/firebase_ai_logic_showcase/lib/flutter_firebase_ai_demo.dart +++ b/firebase_ai_logic_showcase/lib/flutter_firebase_ai_demo.dart @@ -64,7 +64,16 @@ class _DemoHomeScreenState extends State { children: [ if (constraints.maxWidth > 600) // Show NavigationRail on Medium or larger screens + ...[ NavigationRail( + leading: Padding( + padding: EdgeInsets.all(16), + child: Image.asset( + 'assets/firebase-ai-logic.png', + width: 45, + height: 45, + ), + ), selectedIndex: _selectedIndex, onDestinationSelected: _onItemTapped, labelType: NavigationRailLabelType.all, @@ -82,6 +91,8 @@ class _DemoHomeScreenState extends State { ) .toList(), ), + VerticalDivider(thickness: 1, width: 1), + ], Expanded(child: demoPages[_selectedIndex]), ], ),