栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用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>[]),


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/401879.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号