当前位置:网站首页>Why does blocprovider feel similar to provider?
Why does blocprovider feel similar to provider?
2022-07-01 23:38:00 【Ma Nong @ official account on the island with the same name】
Preface
Last one Flutter Introduction and actual combat ( eighty-six ): Less than 40 One line of code BlocProvider, We only used less than 40 A line of code hand rolled a SimpleBlocProvider, It feels OK to use , This is it. Bloc One of the advantages of , You can be based on Bloc This model extends itself , Form your own state management component . Let's take a look at the official flutter_bloc Plugins provide BlocProvider What about? .
Provider Imitator ?
Let's see first BlocProvider Implementation of the counter sample code :
class BlocCounterWrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (_) => CounterCubit(),
child: BlocCounterPage(),
);
}
}
class BlocCounterPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Bloc Counter '),
),
body: Center(
child: BlocBuilder<CounterCubit, int>(
builder: (context, count) => Text(
'$count',
style: TextStyle(
fontSize: 32,
color: Colors.blue,
),
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
context.read<CounterCubit>().increment();
},
tooltip: ' Click to increase ',
child: Icon(Icons.add),
),
);
}
}
Is this code very familiar ? If we look back on our previous Provider State management , It feels very similar ! such as :
Widget build(BuildContext context) {
return BlocProvider(
create: (_) => CounterCubit(),
child: BlocCounterPage(),
);
}
stay Provider The implementation in is as follows .
Widget build(BuildContext context) {
return Provider(
create: (_) => CounterCubit(),
child: BlocCounterPage(),
);
}
And in the FloatingActionButton Inside context.read The usage is the same as Provider The same in . therefore , If you want to from Provider Migrate to Bloc It's also very simple . Actually, from the source code layer by layer up , You will find that there is provider Code for .
library flutter_bloc;
export 'package:bloc/bloc.dart';
export 'package:provider/provider.dart'
show ProviderNotFoundException, ReadContext, SelectContext, WatchContext;
And from Provider and bloc Of GitHub Among the source code contributors, we also found Provider The code contributor to Felix Angelov Namely bloc The originator of the code .. 
So it's not surprising Bloc Use in Provider 了 .
And Provider Similarities and differences
BlocProvider and Provider equally , Provide status data for sub components through component tree . That is, we can use Provider The use of BlocProvider, For example, the use of existing state objects and Provider The use of value parameter assignment :
final counter = CounterCubit();
//...
BlocProvider.value(
value: counter,
child: SomeWidget(),
);
For example, it can be used in subcomponents context.read and context.watch. And the use of select Method listens for partial changes in state data .
final isPositive = context.select((CounterBloc b) => b.state >= 0);
also MultiBlocProvider To pass multiple... To the subcomponent tree Bloc State object .
MultiBlocProvider(
providers: [
BlocProvider<BlocA>(
create: (BuildContext context) => BlocA(),
),
BlocProvider<BlocB>(
create: (BuildContext context) => BlocB(),
),
BlocProvider<BlocC>(
create: (BuildContext context) => BlocC(),
),
],
child: ChildA(),
)
so to speak , If you used Provider State management , Can move seamlessly to BlocProvider. Of course , The state object class still needs to be changed . This is also BlocProvider and Provider The difference between . For example, state objects do not need to implement ChangeNotifier Interface , When the state data changes, there is no need to call notifyListeners To inform refresh . Actually, we start from BlocProvider The source code picks out a method of monitoring the implementation of state objects , In fact, it is also used here that we are SimpleBlocProvider Used in Stream.listen Method to achieve .
static VoidCallback _startListening(
InheritedContext<BlocBase?> e,
BlocBase value,
) {
final subscription = value.stream.listen(
(dynamic _) => e.markNeedsNotifyDependents(),
);
return subscription.cancel;
}
The code of other parts is basically reuse Provider Code for . therefore BlocProvider It can be seen as using Stream.listen Listen for status data ChangeNotifer Of Provider Variants . therefore , If you want to go from Provider Switch to BlocProvider, You can switch boldly , The workload of code modification is very low . And there is no need to call... Repeatedly in the state object notifyListeners To notify that the interface has been refreshed .
summary
This article introduces BlocProvider Use , In terms of writing , Don't feel too much advantage , Personally, I think this is what the author wants Provider Users can switch directly to BlocProvider To provide such a Provider substitute . however , This is just the tip of the iceberg , actually ,flutter_bloc There are many other options , We will introduce them one by one . 
边栏推荐
- algolia 搜索需求,做的快自闭了...
- 硅谷产品实战学习感触
- The essence of software architecture
- Is it safe to choose mobile phone for stock trading account opening in Shanghai?
- 2021 robocom world robot developer competition - preliminary competition of undergraduate group
- 第六章 数据流建模
- 【必会】BM41 输出二叉树的右视图【中等+】
- Daily three questions 6.30 (2)
- 有没有一段代码,让你为人类的智慧所折服
- 小程序表单校验封装
猜你喜欢
随机推荐
Is there a piece of code that makes you convinced by human wisdom
jpa手写sql,用自定义实体类接收
在代码中使用SqlCommand对象
Notes on problems - /usr/bin/perl is needed by mysql-server-5.1.73-1 glibc23.x86_ sixty-four
问题随记 —— /usr/bin/perl is needed by MySQL-server-5.1.73-1.glibc23.x86_64
The third part of the construction of the defense system of offensive and defensive exercises is the establishment of a practical security system
Key points and difficulties of the course "information content security" at Harbin Institute of Technology
2022-07-01:某公司年会上,大家要玩一食发奖金游戏,一共有n个员工, 每个员工都有建设积分和捣乱积分, 他们需要排成一队,在队伍最前面的一定是老板
哈工大《信息内容安全》课程知识要点和难点
上海炒股开户选择手机办理安全吗?
Daily three questions 6.30
from pip._ internal. cli. main import main ModuleNotFoundError: No module named ‘pip‘
ConcurrentSkipListMap——跳表原理
ADO.NET 之sqlConnection 对象使用摘要
Applet form verification encapsulation
Anomaly-Transformer (ICLR 2022 Spotlight)复现过程及问题
SecurityUtils.getSubject().getPrincipal()为null的问题怎么解决
golang中的iota
每日三题 6.28
TS初次使用、ts类型








