提供者 .read() 与 .watch()

Geo*_*ios 6 flutter flutter-provider flutter-bloc

我刚刚将我的flutter_bloc库更新为以下6.1.1状态:

bloc' 已弃用,不应使用。改用 context.read 或 context.watch。将在 v7.0.0 中移除。尝试使用替换来替换已弃用成员的使用。

这是我必须更改的部分代码:

class ContractSubscriptionForm extends StatelessWidget {
  final ContractSubscription contractSubscription;
  const ContractSubscriptionForm(this.contractSubscription, {Key key})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (context) => ContractSubscriptionFormBloc(
        contractSubscription,
        context.read<CoursesGroupBloc>().state.coursesGroupList,  // <---change to .read()
      ),
      child: SubscriptionFormBody(),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

我确实改变的部分是这样的:context.bloc<CoursesGroupBloc>().state.coursesGroupList,context.read<CoursesGroupBloc>().state.coursesGroupList,并且现在正在工作。

在该.read()函数的文档中,我阅读了以下内容:

这种方法与[watch]相反。当值改变时,它不会重新生成widget,并且不能在[StatelessWidget.build]/[State.build]中调用。另一方面,它可以在这些方法之外自由调用。

出于某种原因,这是没有意义的,因为上面的代码在buildStatelessWidget 的a 中,并且正在处理.read()函数而不是.watch().

我错过了什么吗?

pho*_*nix 7

您没有在 StatelessWidget 的构建中调用 context.read ,而是在创建 ContractSubscriptionFormBloc 期间在 BlocProvider 中调用了 context.read 。如果您尝试执行以下操作:

class example extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    context.read<CoursesGroupBloc>().state.coursesGroupList;
    //the rest of your code
  }
}
Run Code Online (Sandbox Code Playgroud)

将出现此错误:尝试在提供者的方法或回调context.read<bloc>中使用buildupdate