每个屏幕均带有FloatingActionButton的BottomNavigationBar

问题描述

我有一条带有BottomNavigationBar的路由,其中​​只有某些屏幕需要具有FloatingActionButton一个按钮可以是完整按钮,也可以是小型按钮,并附加有自定义操作(通常会打开一个弹出对话框)。

class TabScreen extends StatefulWidget {
  TabScreen ({Key key}) : super(key: key);

  @override
  _TabScreenState createState() => _TabScreenState();
}

class _TabScreenState extends State<TabScreen> {
  int _index = 0;

  final _childScreens = <ChildScreen>[
    ChildScreen1(),ChildScreen2(),ChildScreen3(),ChildScreen4()
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Tabs'),),bottomNavigationBar: BottomNavigationBarPart(
            index: _index,onIndexChanged: (index) => setState(() {
                  this._index = index;
                })),body: IndexedStack(
          index: _index,children: _childScreens,floatingActionButton: Visibility(
            child: FloatingActionButton(
                child: Icon(_childScreens[_index].getFabIcon()),onpressed: () => _childScreens[_index].onFabpressed(),mini: _childScreens[_index].isFabMini()),visible: _childScreens[_index].hasFab()));
  }
}

子屏幕的定义如下:

abstract class ChildScreen extends StatefulWidget {
  @override
  State<StatefulWidget> createState();

  bool hasFab() {
    return false;
  }

  IconData getFabIcon() {
    return null;
  }

  bool isFabMini() {
    return false;
  }

  void onFabpressed() {}
}

abstract class ChildScreenState<T extends StatefulWidget> extends State<T> {
  @override
  Widget build(BuildContext context);
}

现在问题出在该onFabpressed方法上。它是在无状态小部件上的小部件上调用的,所以我不知道如何打开State随播对象内部的对话框来访问上下文。

class ChildScreen1 extends ChildScreen {
  @override
  _ChildScreen1State createState() => _ChildScreen1State();

  @override
  bool hasFab() {
    return true;
  }

  @override
  IconData getFabIcon() {
    return Icons.edit;
  }

  @override
  bool isFabMini() {
    return true;
  }

  @override
  void onFabpressed() {
    // How to call the showMyDialog() method?
  }
}

class _ChildScreen1State extends ChildScreenState {
  @override
  Widget build(BuildContext context) {
    // Omitted for brevity
  }

  Future showMyDialog() async {
    return showDialog(
      context: context,builder: (BuildContext context) {
        return AlertDialog(
          title: Text('Dialog'),content: Text('A dialog'),actions: <Widget>[
            FlatButton(
              child: Text(S.of(context).cancel.toupperCase()),onpressed: () {
                Navigator.of(context).pop();
              },FlatButton(
              child: Text(S.of(context).ok.toupperCase()),],);
      },);
  }
}

我做错什么了吗?抱歉,但是我还是Flutter的新手,并试图掌握主要概念...

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)