1

嗨,我在 Flutter 应用程序中使用了Provider ( https://pub.dev/packages/provider )。现在我想使用提供者消费者将浮动操作按钮管理到脚手架中,以确保在我需要隐藏 FAB 按钮时不会重建脚手架。

现在我创建了一个简单的 FABProvider

class FABProvider extends ChangeNotifier {
  FABProvider(bool initialValue) {
    this._visible = initialValue;
  }

  bool _visible;
  bool get visible => _visible;

  void hide() {
    if (_visible) {
      _visible = false;
      notifyListeners();
    }
  }

  void show() {
    if (!_visible) {
      _visible = true;
      notifyListeners();
    }
  }
}

我将所有 Scaffold 包装到 ChangeNotifierProvider 中:

    return ChangeNotifierProvider<FABProvider>.value(
      value: fabProvider,
      child: Scaffold(
      ...
             floatingActionButton: Consumer<FABProvider>(
                 child: createMyFAB(),
                 builder: (context, provider, child) {
                    if (provider.visible) {
                       return child;
                    } else {
                       return null;   <-- Now I need to return null when the fab need to be hided otherwise the scaffold does not animate the FAB 
                    }
                 },
             ),
      ...

      )
      ...

我也尝试返回 Offstage() 或 Container(),但是当返回 Widget 而不是 null 时,Scaffold 不会为 fab 可见性设置动画。

4

1 回答 1

0

如果您使用 Provider 4.1.0 或更高版本,您可以使用参数构建器,让您使用上面的提供程序而不是使用 a Consumer(这会强制您返回一个小部件,因此您不能使用 null),这样您就可以返回 nullfloatingActionButton并在更改时触发动画(预定缩放)

return ChangeNotifierProvider<FABProvider>.value(
  value: fabProvider,
  builder: (context, child) {
    final visible = context.select((FABProvider fab) => fab.visible);
    return Scaffold(
      floatingActionButton: visible ? createMyFAB() : null
      ...
  }
)
于 2020-08-09T16:23:23.577 回答