【问题标题】:Lazy instantiate blocks with BlocProvider.value使用 BlocProvider.value 延迟实例化块
【发布时间】:2021-08-20 23:33:00
【问题描述】:

我正在使用 Flutter 生成的路由,我想share blocs between them

但我认为示例解决方案的扩展性可能不是最好的,因为这些块是用路由器实例化的。

有没有办法仅在用户访问该路由时实例化它们?

class AppRouter {
  final _counterBloc = CounterBloc();

  Route onGenerateRoute(RouteSettings settings) {
    switch (settings.name) {
      case '/':
        return MaterialPageRoute(
          builder: (_) => BlocProvider.value(
            value: _counterBloc,
            child: HomePage(),
          ),
        );
      case '/counter':
        return MaterialPageRoute(
          builder: (_) => BlocProvider.value(
            value: _counterBloc,
            child: CounterPage(),
          ),
        );
      default:
        return null;
    }
  }
}

【问题讨论】:

  • 如果您在所有路线之间共享区块,请将它们构建在您的 Navigator 之上。
  • 不会产生很多样板文件吗?
  • 为什么会生成样板文件?
  • 我认为我需要使用类似将其定义为 null 然后检查是否为 null 以在每条路由上实例化,但似乎我可以在其上使用 late 声明仅在调用时实例化它.
  • 为什么需要在每条路由上都实例化它?每条路线都指向同一个集团,对吧?然后将您的Navigator 包装在BlocProvider 中,这样每条路由都可以隐式访问它。甚至不用担心在每条路线的基础上弄乱它。

标签: flutter dart routes bloc flutter-bloc


【解决方案1】:

知道了! Flutter 有一个名为 late 的新关键字可以在没有任何样板的情况下执行此操作。

class AppRouter {
  late final CounterBloc _counterBloc = CounterBloc();

  Route onGenerateRoute(RouteSettings settings) {
    switch (settings.name) {
      case '/':
        return MaterialPageRoute(
          builder: (_) => BlocProvider.value(
            value: _counterBloc,
            child: HomePage(),
          ),
        );
      case '/counter':
        return MaterialPageRoute(
          builder: (_) => BlocProvider.value(
            value: _counterBloc,
            child: CounterPage(),
          ),
        );
      default:
        return null;
    }
  }
}

这就是我们喜欢颤振的原因!

参考:What is Null Safety in Dart?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多