如何在 flutter 上使用 go_router 将块传递到另一个屏幕

Abd*_*ssa 9 dart flutter bloc flutter-bloc flutter-go-router

在 Flutter 上,我想将本地传递bloc到另一个屏幕。这就是我在使用默认导航器时将块传递到新路线的方式。

Navigator.of(context).push(
      MaterialPageRoute<void>(
        builder: (BuildContext context) =>  BlocProvider.value(
          value: localBloc,
          child: MyPage(),
      ),
    ));
Run Code Online (Sandbox Code Playgroud)

但现在,我正在使用该go_router包进行导航。我怎样才能将本地提供bloc给我想要使用的屏幕BlocProvider.value()

小智 7

您需要将块传递routeusing BlocProvider.value

context.goNamed('/', extra: HomeBloc());

GoRoute(
  path: '/',
  builder: (context, state) { 
    return BlocProvider.value(
      value: state.extra! as HomeBloc,
      child: HomeScreen(),
    );
  }
),
Run Code Online (Sandbox Code Playgroud)

然后在里面HomeScreen就可以得到bloc使用了。

final bloc = context.read<HomeBloc>();
Run Code Online (Sandbox Code Playgroud)


kri*_*yaa -2

默认情况下会加载 BlocProvider lazy

与 Create 一起使用时,它会自动处理关闭实例。默认情况下,仅在访问实例时调用 Create。要覆盖此行为,请将惰性设置为 false。

因此bloc,最好的做法是:

提供使用BlocProvider中的所有main.dartMultiBlocProvider

并在之前添加它,App()以便所有孩子都可以访问它。

  runApp(
      MultiBlocProvider(
          providers: [
            BlocProvider<BlocA>(
              create: (context) => BlocA(),
            ),
             BlocProvider<BlocB>(
              lazy: false                   // if you want the bloc to be loaded here.
              create: (context) => BlocB(),
            ),

          ],
          child: App()
      )
  );
Run Code Online (Sandbox Code Playgroud)

BlocProvider.of<BlocA>(context).add([BlocAEvent]);并在您想要的屏幕中使用它