使用BLoC处理导航的正确方法

使用BLoC处理导航的正确方法,第1张

使用BLoC处理导航的正确方法

编辑:使用该解决方案几个月后,我注意到它存在一些问题:

  1. Android硬件后退按钮不起作用
  2. 当您切换“检查”模式时,该应用会重置。
  3. 没有过渡的可能
  4. 不保证不显示禁止的路线

因此,我不再建议使用这种方法!


对于普通的用户启动的导航,您根本不需要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>[]),


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5010737.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存