flutter - 无论如何,我可以使用 MultiBlocProvider 来清理这组小部件吗?

标签 flutter bloc flutter-bloc

我正在尝试清理这些乱七八糟的小部件,但我找不到办法这样做。我的 NavigationBloc 依赖于 AuthenticationBloc 提供的流,为了防止内存泄漏,我必须关闭该流。

需要 Builder 小部件,以便我可以获得 BlocProvider 提供的最新 BuildContext,但我知道 MultiBlocProvider 会极大地清理这个问题。我想避免将此小部件包装在 runApp 函数中,但我猜这是一个选项。

class _MyAppState extends State<MyApp> {
  final authRepo = AuthRepo();
  AuthenticationBloc authBloc;

  @override
  void dispose() {
    authBloc?.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return BlocProvider<AuthenticationBloc>(
      create: (_) =>
          AuthenticationBloc(authRepo: authRepo)..add(InitializeAuth()),
      child: Builder(builder: (context) {
        authBloc = context.bloc<AuthenticationBloc>();
        return BlocProvider<NavigationBloc>(
          create: (_) => NavigationBloc(authBloc),
          child: MaterialApp(
            title: 'Arrow Manager',
            debugShowCheckedModeBanner: false,
            theme: appTheme(),
            builder:
                ExtendedNavigator<Router>(router: Router(), initialRoute: '/'),
          ),
        );
      }),
    );
  }
}

最佳答案

正如您所说,您可以使用MultiProvider来避免嵌套提供程序

您必须在 initState() 方法中创建您的 AuthenticationBloc

class _MyAppState extends State<MyApp> {
  final authRepo = AuthRepo();
  AuthenticationBloc authBloc;

  @override
  void initState() {
    super.initState();
    authBloc = AuthenticationBloc(authRepo: authRepo);
  }

  @override
  void dispose() {
    authBloc?.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MultiBlocProvider(
      providers: [
        BlocProvider(
          create: (_) => authBloc..add(InitializeAuth()),
        ),
        BlocProvider(
          create: (context) => NavigationBloc(authBloc),
        ),
      ],
      child: Builder(
        builder: (context) {
          authBloc = context.bloc<AuthenticationBloc>();
          return MaterialApp(
            title: 'Arrow Manager',
            debugShowCheckedModeBanner: false,
            theme: appTheme(),
            builder: ExtendedNavigator<Router>(router: Router(), initialRoute: '/'),
          );
        },
      ),
    );
  }
}

关于flutter - 无论如何,我可以使用 MultiBlocProvider 来清理这组小部件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61374963/

相关文章:

flutter - Flutter中Element和RenderObject有什么区别?

android - 我可以从 Dart 调用 Kotlin 函数吗

ios - Flutter:启用 Web 支持后...iOS 模拟器消失了

android - 如何在flutter中将token设置为全局变量?所以我可以随时随地访问 token

flutter - 混合多种数据类型时,Dart模型会引发错误

Flutter 地理定位器给出错误的纬度和经度

flutter - BLoC产生新状态后未更新BlocBuilder()

flutter - BlocProvider.of() 使用不包含 Bloc 的上下文调用 - 即使它包含

flutter - 无法从方法 'Null' 返回类型为 'onGenerateRoute' 的值,因为它的返回类型为 'Route<dynamic>'

Flutter Bloc 不更新状态/不工作