Bedrock開發框架功能介紹git
Bedrock開發框架github
通常在flutter中刷新widget,最經常使用的是經過方法redux
setState()
複製代碼
舉個栗子,有頁面以下markdown
僞-代碼以下:框架
build(){
debugPrint('page build');
return Column(children: [
//上方按鈕
btnAbove(),
// 兩個色塊
row(children:[紅色、藍色])
//下方按鈕
btnBelow(),
//色塊 widget
DoubleColorWidget(),
]);
}
//
class DoubleColorWidget{
build(){
debugPrint('DoubleColorWidget build');
return row(children:[紅色、藍色]);
}
}
複製代碼
當我點擊上方的按鈕以交換毗鄰的兩個方塊的顏色時,經過log能夠發現,頁面和DoubleColorWidget 都執行了一遍build()方法。ide
每點一次都會執行,且DoubleColorWidget(並不須要刷新)也觸發了 build
複製代碼
頁面簡單的話,也許能夠忽略,若是頁面比較複雜,那麼大量的無心義build()將會帶來性能的損耗。工具
通常狀況下,咱們能夠經過各類狀態控制工具,如:oop
Bloc,redux,fish-redux,Provider等等
複製代碼
也能夠爲子widget寫一個控制器,並對外暴露。post
還能夠用flutter自帶的inheritWidget或各類Builder,如最簡單的statefulWidgetBuilder,對須要刷新的widget進行包裹,並單獨rebuild。性能
與此同時就會額外增長很多代碼,尤爲是頁面中須要獨立刷新的widget很是多時(實際開發中,這基本難以免)。
這裏我向你們介紹一下Bedrock框架下的刷新方法。
首先Bedrock對於上方提到的刷新依然支持,同時藉助框架的設計:
在減小代碼的同時,支持直接調用widget的方法,進而完成任意粒度的局部刷新(等各類操做),如下是更改後的頁面代碼:
class PartRefreshPage extends PageState{
bool exp1 = false;
///下方色塊
final PartWidget partWidget = PartWidget();
@override
Widget build(BuildContext context) {
debugPrint('page build');
return switchStatusBar2Dark(child: Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
///上方按鈕
RaisedButton(onPressed: (){
exp1 = !exp1;
setState(() {
});
},
child: Text('change color By setState()'),),
///上方色塊
Container(
height: getWidthPx(100),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
width: getWidthPx(80),
color: exp1 ? Colors.red:Colors.blue,
),
Container(
width: getWidthPx(80),
color: exp1 ? Colors.blue:Colors.red,
),
],
),
),
getSizeBox(height: getWidthPx(100)),
///-----------下方代碼區域-----------
///下方按鈕
RaisedButton(onPressed: (){
partWidget.switchColor();
},
child: Text('change color By part refresh'),),
///下方色塊
partWidget.generateWidget(),
],
),
));
}
}
class PartWidget extends WidgetState{
bool exp1 = false;
///此爲Demo 故,書寫隨意
void switchColor(){
if(!mounted)return;
exp1 = !exp1;
setState(() {
});
}
@override
Widget build(BuildContext context) {
debugPrint('DoubleColorWidget build');
return Container(
height: getWidthPx(100),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
width: getWidthPx(80),
color: exp1 ? Colors.red:Colors.blue,
),
Container(
width: getWidthPx(80),
color: exp1 ? Colors.blue:Colors.red,
),
],
),
);
}
}
複製代碼
咱們能夠看到,在‘下方’代碼區域中,下方按鈕若是想交換其下方兩個色塊的顏色,只須要直接調用它的switchColor(),同時不會觸發無關widget和頁面的build方法。
另外,由於state對外暴露,咱們在處理widget上,變得更爲靈活方便。
謝謝你們的閱讀,若有錯誤,還請指出,謝謝。