bloc模式将数据,业务逻辑,界面解耦。
flutter_bloc是其中一种实现框架,底层采用的依然是inheritedwidget。所以,不仅是解耦,还可以管理state,可以非常容易进行跨越层级管理状态。
基本的组成非常简单
Widget build(BuildContext context) {
return BlocProvider(
create: (_) => ThemeCubit(),
child: BlocBuilder<ThemeCubit, ThemeData>(
builder: (_, theme) {
return MaterialApp(
theme: theme,
home: BlocProvider(
create: (_) => CounterBloc(),
child: CounterPage(),
),
);
},
),
);
}
最外层是一个blocprovider,这其实是一个页面信息和逻辑数据进行交互的平台,因为这个实例里面持有了两者的实例。
create,业务逻辑和数据的实例,通常继承自cubit或bloc等,内部没有太大区别,区别就在于泛型。bloc<t,k>两个泛型,前者表示逻辑类型,后者表示要变化的数据。cubit<t>则相对简单,只有数据类型。
child,通常直接是BlocBuilder或者子布局含有这个,里面核心是build函数,blocprovider,会寻找这个函数,传了两个实例,前者是bloc或者cubit的实例,也就是create那里写的实例,后者是data,所以blocbuilder通常是包裹需要局部刷新的组件。如此就可以随便操作了。
进行逻辑操作使用方法通常是
context.read<CounterBloc>().add(CounterEvent.decrement)
context.read就是寻找实例,add(业务逻辑类型),这种是针对继承自bloc的,传入两个泛型的。
context.read<ThemeCubit>().toggleTheme(),
这种是针对cubit的,直接调用里面的函数,或者可以直接赋值也行