【问题标题】:Flutter - Navigator pop not dismiss showDialog widget according to specified contextFlutter - Navigator pop 不会根据指定的上下文关闭 showDialog 小部件
【发布时间】:2020-01-05 02:55:51
【问题描述】:

我有两个堆叠的Scaffolds,一个父母和一个孩子。在按下按钮时,Scaffolds 都会从各自的上下文中显示一个弹出窗口。但无论如何,Navigator.pop 总是关闭最顶部的弹出窗口,忽略传递的上下文。

class StateTest extends State<ScreenTest>{

  BuildContext parent, child;

  @override
  Widget build(BuildContext context) => Scaffold(
    drawer : Drawer(child: Container()),
    body: Builder(builder : (BuildContext context){
      this.parent = context;
      return Scaffold(
        body: Builder(builder : (BuildContext context){
          this.child = context;
        }),
        floatingActionButton: FloatingActionButton(
          onPressed: (){
            showDialog(context: parent, child: Center(child: Text('PARENT')));
            showDialog(context: child, child: Center(child: Text('CHILD')));
            Timer(Duration(seconds: 1), () => Navigator.of(parent).pop());
          }
        ),
      );
    })
  );
}

我只想从特定上下文中消除弹出窗口。

【问题讨论】:

标签: flutter


【解决方案1】:

Navigator.of(context) 获取最近的 Navigator 父小部件。

parentchild 上下文引用相同的 navigator,因此两个对话框都被推送到同一个导航器,最后一个对话框是弹出的

方法是添加一个新的导航器:

  • 您要显示的离用户更近的对话框必须是最远的导航器。在我们的例子中是根导航器

  • 将在脚手架和其他对话框之间显示的对话框应该是从新创建的导航器推送的

online demo


class StateTest extends State<ScreenTest>{

  @override
  Widget build(BuildContext context) => 
    Navigator(
         onGenerateRoute: _getRoute
  );

  Route _getRoute(RouteSettings settings) {
    switch (settings.name){
      case '/':
        return MaterialPageRoute(
      settings: settings,
      builder: (BuildContext context) {
          return Scaffold(body: Container(), floatingActionButton: FloatingActionButton(
          onPressed: (){
            showDialog(context: context, child: Center(child: Text('PARENT')), useRootNavigator: false);
            showDialog(context: context, child: Center(child: Text('CHILD')), );
            Timer(Duration(seconds: 1), () => Navigator.of(context).pop());
          }
        ));
        });
      default:
        return null;
    }

  }

}

解释小部件树的图

【讨论】:

  • 没有先测试它我确定这是我正在寻找的答案。谢谢楼主
猜你喜欢
  • 2021-08-22
  • 2018-09-17
  • 1970-01-01
  • 2021-02-19
  • 2019-04-17
  • 2021-09-22
  • 2021-06-13
  • 2021-05-18
  • 1970-01-01
相关资源
最近更新 更多