2

我只是在颤抖中了解一肘。我在教程视频中学习,所以在那个视频中,导师制作了一个登录页面,其中包含一个电子邮件和密码文本字段以及一个登录按钮。在那段视频中,导师仍然使用旧版本的flutter_bloc。当我遵循其中一个代码行时出现警告

child: ElevatedButton(
  onPressed: () {
    context.watch<AuthCubit>().signIn(
     _emailController.text,
     _passwordController.text);
}

该代码写在 onPressed 功能按钮内。它说context.bloc已弃用。当我尝试运行该应用程序时,它返回一个错误,因为我使用的 flutter_bloc 版本不支持 null 安全,所以我将它升级到当前版本(7.3.1),我在 6.1.0 版本更新日志中找到了这个(你可以看到它在flutter_bloc 更改日志中)

deprecated: context.bloc in favor of context.read and context.watch

因为我不知道我刚刚更改的区别context.bloc然后context.watch我再次运行该应用程序并返回另一个错误

Tried to listen to a value exposed with a provider, from outside of the widget tree.

This is likely caused by an event handler (like a button's onPressed) that called
Provider.of without passing `listen: false`.

To fix, write:
Provider.of<AuthCubit>(context, listen: false);

It is unsupported because may pointlessly rebuild the widget associated to the
the event handler, when the widget tree doesn't care about the value.
...

当我将其更改为context.read有效时。我想知道它们之间的区别

4

1 回答 1

0

context.watch<T>()听 T 上的变化

context.read<T>()不听就返回 T

你在打电话

context.watch<AuthCubit>().signIn(
     _emailController.text,
     _passwordController.text);

在中ElevatedButton's onPressed(),从而AuthCubit从小部件树的外部监听提供者。当您将其更改为使用时,您无需从小部件树外部收听它即可context.read<AuthCubit>返回。AuthCubit

于 2021-11-02T09:12:10.310 回答