????flutter開發(fā)的官方推薦是響應(yīng)式編程统舀,響應(yīng)式編程簡(jiǎn)單理解是數(shù)據(jù)流變化自動(dòng)驅(qū)動(dòng)view層刷新的一種開發(fā)方式匆骗;這樣的開發(fā)讓業(yè)務(wù)和view層徹底解耦,是很棒的一種開發(fā)思想誉简,所以flutter的開發(fā)就成了widget的組裝及其屬性的數(shù)據(jù)綁定碉就。但是我們很多時(shí)候不僅僅是進(jìn)行數(shù)據(jù)綁定,view層也不能狹隘的理解為widget的組裝與屬性賦值闷串,view層結(jié)合view相關(guān)的一些業(yè)務(wù)邏輯的處理才能讓架構(gòu)更為合理瓮钥,比如view點(diǎn)擊事件的設(shè)定、新的路由的打開烹吵、新的對(duì)話框的打開碉熄、動(dòng)畫相關(guān)的操作等,此時(shí)我們不僅需要在widget中進(jìn)行一些業(yè)務(wù)邏輯的處理肋拔,我們還需要得到這個(gè)widget對(duì)于的BuildContext锈津。下面的代碼應(yīng)該非常常見(jiàn)了吧:
body: Center(
child: Builder(
builder: (context) {
return Text("Builder").gesture(onTap: () {
showDialog(context: context, child: Text("dialog"));
});
},
),
),
????如果你想在點(diǎn)擊了某個(gè)組件之后對(duì)界面進(jìn)行刷新,那么通常你需要定義一個(gè)StatefulWidget在需要刷新的地方調(diào)用setState凉蜂,但是StatefulBuilder看起來(lái)也是一個(gè)不錯(cuò)的選擇:
這里沒(méi)有使用定義StatefulWidget的方式一姿,因?yàn)檫@個(gè)邏輯很簡(jiǎn)單,定義StatefulWidget是麻煩而且沒(méi)有必要的
body: Center(
child: StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return Text("clickTimes$clickTimes").gesture(onTap: () {
setState(() {
clickTimes++;
});
});
},
),
),
????以上Builder類和StatefulBuilder都是官方提供的類跃惫,以便開發(fā)者使用叮叹,但我們不能滿足于簡(jiǎn)簡(jiǎn)單單的使用,我們還要知道他的本質(zhì)爆存。
????那先來(lái)看看Builder吧:
class Builder extends StatelessWidget {
const Builder({
Key key,
@required this.builder,
}) : assert(builder != null),
super(key: key);
final WidgetBuilder builder;
@override
Widget build(BuildContext context) => builder(context);
}
????Builder 的源碼非常簡(jiǎn)單蛉顽,其實(shí)就是一個(gè)StatelessWidget ,只不過(guò)是其build方法先较,通過(guò)傳入的builder方法由使用者實(shí)現(xiàn)携冤。再看看傳入的builder的簽名:
/// * [IndexedWidgetBuilder], which is similar but also takes an index.
/// * [TransitionBuilder], which is similar but also takes a child.
/// * [ValueWidgetBuilder], which is similar but takes a value and a child.
typedef WidgetBuilder = Widget Function(BuildContext context);
????也很簡(jiǎn)單悼粮,就是一個(gè)參數(shù)為BuilderContext返回值為Widget的Fuction而已。
????下面看看StatefulBuilder
class StatefulBuilder extends StatefulWidget {
const StatefulBuilder({
Key key,
@required this.builder,
}) : assert(builder != null),
super(key: key);
final StatefulWidgetBuilder builder;
@override
_StatefulBuilderState createState() => _StatefulBuilderState();
}
class _StatefulBuilderState extends State<StatefulBuilder> {
@override
Widget build(BuildContext context) => widget.builder(context, setState);
}
????StatefulBuilder 的源碼也非常簡(jiǎn)單曾棕,其實(shí)就是一個(gè)StatefulWidget 扣猫,與Builder的不同之處在于其傳入的builder的函數(shù)簽名包含兩個(gè)參數(shù),多了一個(gè)setState翘地,setState是一個(gè)函數(shù)引用申尤,調(diào)用這個(gè)函數(shù)可以導(dǎo)致這個(gè)StatefulWidget 的bulide方法被調(diào)用,StatefulBuilder 就是通過(guò)傳入的builder方法將setState傳遞給使用者衙耕,在外部刷新這個(gè)widget昧穿。再看看StatefulBuilder 的builder的簽名:
/// Signature for the builder callback used by [StatefulBuilder].
///
/// Call [setState] to schedule the [StatefulBuilder] to rebuild.
typedef StatefulWidgetBuilder = Widget Function(BuildContext context, StateSetter setState);
???? 非常簡(jiǎn)單,就是參數(shù)為BuilderContext和StateSetter 返回值為Widget的Fuction而已橙喘。
???? 以上就是關(guān)于Builder和StatefulBuilder的探究過(guò)程时鸵。