diff --git a/example/lib/choose_user_page.dart b/example/lib/choose_user_page.dart index f1a53773..0e16f012 100644 --- a/example/lib/choose_user_page.dart +++ b/example/lib/choose_user_page.dart @@ -8,6 +8,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; import 'notifications_service.dart'; +import 'routes/routes.dart'; const kStreamApiKey = 'STREAM_API_KEY'; const kStreamUserId = 'STREAM_USER_ID'; @@ -154,18 +155,10 @@ class ChooseUserPage extends StatelessWidget { if (!kIsWeb) { initNotifications(client); } - - Navigator.pop(context); - await Navigator.pushReplacement( + Navigator.pushReplacementNamed( context, - MaterialPageRoute( - builder: (context) { - return StreamChat( - client: client, - child: ChannelListPage(), - ); - }, - ), + Routes.CHANNEL_LIST, + arguments: client, ); }, leading: UserAvatar( @@ -188,12 +181,7 @@ class ChooseUserPage extends StatelessWidget { }), ListTile( onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => AdvancedOptionsPage(), - ), - ); + Navigator.pushNamed(context, Routes.ADVANCED_OPTIONS); }, leading: CircleAvatar( child: StreamSvgIcon.settings( diff --git a/example/lib/group_chat_details_screen.dart b/example/lib/group_chat_details_screen.dart index 36999c7f..88de33a9 100644 --- a/example/lib/group_chat_details_screen.dart +++ b/example/lib/group_chat_details_screen.dart @@ -3,6 +3,7 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart'; import 'package:uuid/uuid.dart'; import 'main.dart'; +import 'routes/routes.dart'; class GroupChatDetailsScreen extends StatefulWidget { final List selectedUsers; @@ -128,18 +129,12 @@ class _GroupChatDetailsScreenState extends State { 'name': groupName, }); await channel.watch(); - Navigator.of(context) - ..pop() - ..pushReplacement( - MaterialPageRoute( - builder: (context) { - return StreamChannel( - child: ChannelPage(), - channel: channel, - ); - }, - ), - ); + Navigator.pushNamedAndRemoveUntil( + context, + Routes.CHANNEL_PAGE, + ModalRoute.withName(Routes.CHANNEL_LIST), + arguments: channel, + ); }, ), ), diff --git a/example/lib/main.dart b/example/lib/main.dart index d2be225a..6cf35e0e 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -10,6 +10,8 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; import 'notifications_service.dart'; +import 'routes/app_routes.dart'; +import 'routes/routes.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -47,19 +49,19 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return MaterialApp( - debugShowCheckedModeBanner: false, - theme: ThemeData.light(), - darkTheme: ThemeData.dark(), - //TODO change to system once dark theme is implemented - themeMode: ThemeMode.light, - builder: (context, widget) { - return StreamChat( - child: widget, - client: client, - ); - }, - home: client.state.user == null ? ChooseUserPage() : ChannelListPage(), + return StreamChat( + client: client, + child: MaterialApp( + debugShowCheckedModeBanner: false, + theme: ThemeData.light(), + darkTheme: ThemeData.dark(), + //TODO change to system once dark theme is implemented + themeMode: ThemeMode.light, + onGenerateRoute: AppRoutes.generateRoute, + initialRoute: client.state.user == null + ? Routes.CHOOSE_USER + : Routes.CHANNEL_LIST, + ), ); } } @@ -71,11 +73,7 @@ class ChannelListPage extends StatelessWidget { return Scaffold( appBar: ChannelListHeader( onNewChatButtonTap: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => NewChatScreen(), - ), - ); + Navigator.pushNamed(context, Routes.NEW_CHAT); }, ), drawer: _buildDrawer(context, user), @@ -83,9 +81,7 @@ class ChannelListPage extends StatelessWidget { body: ChannelsBloc( child: ChannelListView( onStartChatPressed: () { - Navigator.of(context).push(MaterialPageRoute(builder: (context) { - return NewChatScreen(); - })); + Navigator.pushNamed(context, Routes.NEW_CHAT); }, swipeToAction: true, filter: { @@ -147,11 +143,10 @@ class ChannelListPage extends StatelessWidget { color: Colors.black.withOpacity(.5), ), onTap: () { - Navigator.of(context) - ..pop() - ..push(MaterialPageRoute(builder: (context) { - return NewChatScreen(); - })); + Navigator.popAndPushNamed( + context, + Routes.NEW_CHAT, + ); }, title: Text( 'New direct message', @@ -165,11 +160,10 @@ class ChannelListPage extends StatelessWidget { color: Colors.black.withOpacity(.5), ), onTap: () { - Navigator.of(context) - ..pop() - ..push(MaterialPageRoute(builder: (context) { - return NewGroupChatScreen(); - })); + Navigator.popAndPushNamed( + context, + Routes.NEW_GROUP_CHAT, + ); }, title: Text( 'New group', @@ -188,11 +182,9 @@ class ChannelListPage extends StatelessWidget { final secureStorage = FlutterSecureStorage(); await secureStorage.deleteAll(); Navigator.pop(context); - await Navigator.pushReplacement( + Navigator.pushReplacementNamed( context, - MaterialPageRoute( - builder: (context) => ChooseUserPage(), - ), + Routes.CHOOSE_USER, ); }, leading: StreamSvgIcon.user( diff --git a/example/lib/new_chat_screen.dart b/example/lib/new_chat_screen.dart index 5e6af8fc..364c8b7e 100644 --- a/example/lib/new_chat_screen.dart +++ b/example/lib/new_chat_screen.dart @@ -6,6 +6,7 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart'; import 'chips_input_text_field.dart'; import 'main.dart'; import 'new_group_chat_screen.dart'; +import 'routes/routes.dart'; class NewChatScreen extends StatefulWidget { @override @@ -182,9 +183,9 @@ class _NewChatScreenState extends State { Container( child: InkWell( onTap: () { - Navigator.push( + Navigator.pushNamed( context, - MaterialPageRoute(builder: (_) => NewGroupChatScreen()), + Routes.NEW_GROUP_CHAT, ); }, child: Padding( @@ -334,16 +335,11 @@ class _NewChatScreenState extends State { channel.update({ 'draft': false, }); - Navigator.pushReplacement( + Navigator.pushNamedAndRemoveUntil( context, - MaterialPageRoute( - builder: (context) { - return StreamChannel( - child: ChannelPage(), - channel: channel, - ); - }, - ), + Routes.CHANNEL_PAGE, + ModalRoute.withName(Routes.CHANNEL_LIST), + arguments: channel, ); } } diff --git a/example/lib/new_group_chat_screen.dart b/example/lib/new_group_chat_screen.dart index ece3ca9a..ff77e44d 100644 --- a/example/lib/new_group_chat_screen.dart +++ b/example/lib/new_group_chat_screen.dart @@ -5,6 +5,7 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart'; import 'group_chat_details_screen.dart'; import 'search_text_field.dart'; +import 'routes/routes.dart'; class NewGroupChatScreen extends StatefulWidget { @override @@ -78,14 +79,10 @@ class _NewGroupChatScreenState extends State { color: Color(0xFF006CFF), ), onPressed: () async { - final updatedList = await Navigator.push( + final updatedList = await Navigator.pushNamed( context, - MaterialPageRoute( - builder: (_) => GroupChatDetailsScreen( - selectedUsers: - _selectedUsers.toList(growable: false), - ), - ), + Routes.NEW_GROUP_CHAT_DETAILS, + arguments: _selectedUsers.toList(growable: false), ); if (updatedList != null) { setState(() { diff --git a/example/lib/routes/app_routes.dart b/example/lib/routes/app_routes.dart new file mode 100644 index 00000000..19352319 --- /dev/null +++ b/example/lib/routes/app_routes.dart @@ -0,0 +1,64 @@ +import 'routes.dart'; +import 'package:flutter/material.dart'; +import '../choose_user_page.dart'; +import '../advanced_options_page.dart'; +import 'package:stream_chat_flutter/stream_chat_flutter.dart'; +import '../main.dart'; +import '../group_chat_details_screen.dart'; +import '../new_group_chat_screen.dart'; +import '../new_chat_screen.dart'; + +class AppRoutes { + /// Add entry for new route here + static Route generateRoute(RouteSettings settings) { + final args = settings.arguments; + switch (settings.name) { + case Routes.CHANNEL_LIST: + return MaterialPageRoute( + settings: const RouteSettings(name: Routes.CHANNEL_LIST), + builder: (_) { + return ChannelListPage(); + }); + case Routes.CHOOSE_USER: + return MaterialPageRoute( + settings: const RouteSettings(name: Routes.CHOOSE_USER), + builder: (_) { + return ChooseUserPage(); + }); + case Routes.ADVANCED_OPTIONS: + return MaterialPageRoute( + settings: const RouteSettings(name: Routes.ADVANCED_OPTIONS), + builder: (_) => AdvancedOptionsPage(), + ); + case Routes.CHANNEL_PAGE: + return MaterialPageRoute( + settings: const RouteSettings(name: Routes.CHANNEL_PAGE), + builder: (_) { + return StreamChannel( + channel: args as Channel, + child: ChannelPage(), + ); + }); + case Routes.NEW_CHAT: + return MaterialPageRoute( + settings: const RouteSettings(name: Routes.NEW_CHAT), + builder: (_) { + return NewChatScreen(); + }); + case Routes.NEW_GROUP_CHAT: + return MaterialPageRoute( + settings: const RouteSettings(name: Routes.NEW_GROUP_CHAT), + builder: (_) { + return NewGroupChatScreen(); + }); + case Routes.NEW_GROUP_CHAT_DETAILS: + return MaterialPageRoute( + settings: const RouteSettings(name: Routes.NEW_GROUP_CHAT_DETAILS), + builder: (_) { + return GroupChatDetailsScreen( + selectedUsers: args, + ); + }); + } + } +} diff --git a/example/lib/routes/routes.dart b/example/lib/routes/routes.dart new file mode 100644 index 00000000..f4ace9a4 --- /dev/null +++ b/example/lib/routes/routes.dart @@ -0,0 +1,10 @@ +/// Define all the route names here +class Routes { + static const String CHANNEL_LIST = '/channel_list'; + static const String CHOOSE_USER = '/choose_user'; + static const String ADVANCED_OPTIONS = '/advance_options'; + static const String CHANNEL_PAGE = '/channel_page'; + static const String NEW_CHAT = '/new_chat'; + static const String NEW_GROUP_CHAT = '/new_group_chat'; + static const String NEW_GROUP_CHAT_DETAILS = '/new_group_chat_details'; +}