flutter_bloc中context.watch与context.read的区别是什么?
Flutter Bloc 中 context.read 与 context.watch 的区别
核心定义差异
context.watch<T>()
属于监听型获取:调用后会持续监听目标Bloc/Cubit的状态变化,只要状态更新就会触发当前所在Widget的build重建。该方法仅允许在Widget的build方法内部使用,默认对应Provider.of<T>(context, listen: true),在点击回调、生命周期函数等非build场景下调用会触发权限报错。context.read<T>()
属于一次性获取:调用后仅获取一次目标Bloc/Cubit的实例,不会监听后续的状态变化,也不会触发当前Widget的重建。该方法可以在任意场景下调用,包括按钮onPressed回调、initState生命周期等,默认对应Provider.of<T>(context, listen: false),适配登录按钮调用方法的场景。
正确使用场景示例
1. 用watch响应状态更新(build方法内)
当界面需要随着Bloc状态变化更新显示内容时,必须在build方法内使用watch:
@override Widget build(BuildContext context) { // 登录状态变化时要切换界面显示,因此需要监听 final loginState = context.watch<AuthCubit>().state; if(loginState is AuthLoading) { return const CircularProgressIndicator(); } return const Text('登录页'); }
2. 用read调用Bloc方法(非build场景)
当只需要触发Bloc的事件/方法,不需要跟随状态更新当前组件时,使用read:
child: ElevatedButton( onPressed: () { // 仅需要获取AuthCubit实例调用登录方法,不需要监听状态 context.read<AuthCubit>().signIn( _emailController.text, _passwordController.text ); }, child: const Text('登录') )
内容的提问来源于stack exchange,提问作者Alun Paranggi Wicaksono
相关产品推荐
相关产品推荐

