flutter 块提供程序.value与块提供程序(创建:)

piok6c0g  于 2023-01-02  发布在  Flutter
关注(0)|答案(6)|浏览(202)

我正在使用flutter_bloc,我想知道我应该使用哪种方法,这两种方法有什么区别?:我读到第一个有(值)的集团不会自动关闭,但实际上我不明白这是什么意思?

BlocProvider<LoginBloc>.value(
  value:  (LoginBloc(LoginInitialState(), AuthRepository())),
  ),

  

 BlocProvider<ProfileBloc>(
         create:  (context) => ProfileBloc(ProfileInitialState(), AuthRepository()),
       ),
taor4pac

taor4pac1#

据我所知,你会用途:

BlocProvider.value(
  value: BlocProvider.of<BlocA>(context),
  child: ScreenA(),
);

当您已经在另一个BlocProvider中创建了一个bloc,并且您只希望同一个块在小工具树中的其他位置可用时。
我假设,因为这个bloc不是由您当前使用的BlocProvider(与BlocProvider.value一起)创建的,所以它不会处理关闭bloc-这将由原始BlocProvider完成。
因此,除非您要使用的bloc在其他地方已经不存在,否则您可能只需要对create使用常规方法。

yzxexxkh

yzxexxkh2#

在我们的例子中,如果我们要创建一个全新的腕尺来传递给孩子,我们将用途:

BlocProvider<NameOfCubit>(
  ...
  child: Screen(),
)

如果我们想使用一个已经创建好的腕尺,那么我们可以通过以下方式传递它:

BlocProvider<NameOfCubit>.value(
  ...
  child: Screen(),
)
cmssoen2

cmssoen23#

在我看来,块提供程序将重置所有的状态和事件,并再次发送一个新的EventIntial。另一方面,Bloc.value不会再次发送EventIntial。

ctzwtxfj

ctzwtxfj4#

  • 我想知道我应该使用哪种方法**以及这两种方法之间的区别是什么?*

除非您不需要挑选和使用已经存在的Bloc示例,否则应该使用BlocProvider(create:)。
来自 * 软件包:flutter_bloc/src/bloc_provider.dart*:
不应在BlocProvider. value中创建新的[Bloc]或[Cubit]。应始终使用[Create]函数中的默认构造函数创建新示例。
以下代码错误,因为您在值中创建了LoginBloc示例:

BlocProvider<LoginBloc>.value(
  value:  (LoginBloc(LoginInitialState(), AuthRepository())),
  child: .....
  ),

但您可以使用此函数从上下文树中的其他位置获取LoginBloc示例:

BlocProvider<LoginBloc>.value(
  value:  BlocProvider.of<LoginBloc>(context),
  child: ....
  ),
bksxznpy

bksxznpy5#

**BlocProvider.value()**不会自动关闭您的区块,您需要使用dispose方法手动关闭它。

rt4zxlrg

rt4zxlrg6#

根据官方文档,BlocProvider应该用于创建新的块,这些块将对子树的其余部分可用。在这种情况下,由于BlocProvider负责创建块,它将自动处理关闭它。

BlocProvider(
  create: (BuildContext context) => BlocA(),
  child: ChildA(),
);

在某些情况下,BlocProvider可用于将现有区块提供给小工具树的新部分。这在现有区块需要提供给新路由时最常用。在这种情况下,BlocProvider不会自动关闭区块,因为它没有创建区块。

BlocProvider.value(
  value: BlocProvider.of<BlocA>(context),
  child: ScreenA(),
);

所以第一种方法是错误的

相关问题