如何使用Provider显示或隐藏FAB?

How to use Provider to show or hide FAB?

我刚刚开始寻找 setState() 的替代品,因此寻找 Provider。在我正在寻找实现 Provider 的第一个程序中,我唯一使用的 setState() 是在初始 build() 上,并且当数据更改时为了显示 FAB 而 FAB 还没有显示。这个程序中有六个TextField个小部件,它们都有TextEditingControllers,所以它们都有自己的状态。

_tfDataHasChanged (bool)发生变化的情况下,是否可以使用Provider,如果可以,如何使用?

创建 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 看起来像

class ShowFab with ChangeNotifier {
  boolean shouldShow;

  void showFab( boolean show ){
    shouldShow = show;
    notifyListeners();
  }
}

显然你的具体逻辑会有所不同, ShowFab 需要在小部件树中更高的位置提供。

ChangeNotifierProvider<ShowFab>( builder: (context) => ShowFab(), child: .... )