我刚刚开始寻找setState()
的替代品,因此也是提供者。在我正在考虑实现提供程序的第一个程序中,我使用的唯一setState()
是在初始build()
上,以及当数据更改以便在尚未显示 FAB 时显示 FAB。这个程序中有六个TextField
小部件,它们都有TextEditingControllers
,所以它们都有自己的状态。
在这种情况下,当_tfDataHasChanged (bool)
发生变化时,使用提供程序是否可行,如果是,如何
? 下面有 FAB 创建的代码:
Widget _createFab() {
if (_tfDisplayOnly || !_tfDataHasChanged) return null;
return FloatingActionButton(
onPressed: _btnSubmitPressed,
backgroundColor: _colorFab,
mini: false,
tooltip: _sBtnSubmitText /* Add or Create */,
child: _iconFab,
);
}
您可以:
Widget _createFab( BuildContext context) {
boolean showFab = Provider.of<ShowFab>(context).shouldShow;
return showFab?FloatingActionButton(
onPressed: _btnSubmitPressed,
backgroundColor: _colorFab,
mini: false,
tooltip: _sBtnSubmitText /* Add or Create */,
child: _iconFab,
):null;
}
与 ShowFab 类看起来像
class ShowFab with ChangeNotifier {
boolean shouldShow;
void showFab( boolean show ){
shouldShow = show;
notifyListeners();
}
}
显然你的具体逻辑会有所不同, ShowFab 需要在小部件树的更高位置提供。
ChangeNotifierProvider<ShowFab>( builder: (context) => ShowFab(), child: .... )