编辑:使用该解决方案几个月后,我注意到它存在一些问题:
- Android硬件后退按钮不起作用
- 当您切换“检查”模式时,该应用会重置。
- 没有过渡的可能
- 不保证不显示禁止的路线
因此,我不再建议使用这种方法!
对于普通的用户启动的导航,您根本不需要BLoC模式。只需使用即可
Navigator。
登录是一种特殊情况。遵循BLoC模式,提供
isAuthenticated流将很有意义:
abstract class MyBloc { Stream<bool> get isAuthenticated;}
您的应用可能会具有2种不同的命名路由树:一种用于登录用户,另一种用于匿名用户:
final Map<String, WidgetBuilder> anonymousRoutes = { '/': (context) => new LoginScreen(), // default for anon '/register': (context) => new RegisterScreen(),};final Map<String, WidgetBuilder> authenticatedRoutes = { '/': (context) => new HomeScreen(), // default for logged in '/savings': (context) => new SavingsScreen(), // ...};
通常,
Navigator和及其命名的路由与紧密耦合
MaterialApp,但是您还可以定义自己的
isAuthenticated流,该流在更新流时重新构建:
class MyApp extends StatelessWidget { const MyApp({Key key, this.bloc}) : super(key: key); final MyBloc bloc; @override Widget build(BuildContext context) { return MaterialApp( builder: (BuildContext context, Widget child) { return StreamBuilder<bool>( stream: bloc.isAuthenticated, builder: (BuildContext context, AsyncSnapshot<bool> snapshot) { if (!snapshot.hasData) { return Text('loading...'); } bool isAuthenticated = snapshot.data; return _buildNavigator(isAuthenticated); }, ); }, ); }}Navigator _buildNavigator(bool isAuthenticated) { // different route tree and different default route depending on auth state final routes = isAuthenticated ? authenticatedRoutes : anonymousRoutes; return Navigator( key: new ValueKey(isAuthenticated), onGenerateRoute: (RouteSettings settings) { final name = settings.name; return new MaterialPageRoute( builder: routes[name], settings: settings, ); }, onUnknownRoute: (RouteSettings settings) { throw Exception('unknown route'); }, );}
可悲的是,现在(2018-07-14)Flutter代码中有两个相互矛盾的断言,您必须删除它们才能使上面的代码正常工作(您可以使用IDE对其进行编辑):
93和96行
packagesflutterlibsrcwidgetsapp.dart
//assert(navigatorObservers != null),//assert(onGenerateRoute != null || navigatorObservers == const <NavigatorObserver>[]),
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)