Navigator.pop不会在扑朔迷离中关闭simpledialog

时间:2019-12-18 04:19:46

标签: android flutter navigator showdialog simpledialog

我正在使用Flutter构建android应用。我在以编程方式关闭简单对话框时遇到问题。

现在,我有一个名为ListVessel的有状态页面。该页面包含来自otherVessel数组的listTile。
下面是此页面的代码。

class ListVessel extends StatefulWidget {
  final Function() notifyParent;
  ListVessel({Key key, @required this.notifyParent}) : super(key: key);

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

class _ListVesselState extends State<ListVessel> {
  @override
  Widget build(BuildContext context) {
      return ListView.separated(
        separatorBuilder: (context, index) => Divider(color: Colors.blueGrey),
        itemCount: otherVessels.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text("Name: "+otherVessels[index]["shipName"]),
            onTap: () {
              showDialog (
                  context: context,
                  builder: (_){
                    return otherTap(idx:index);
                  }
              );
            }
          );
        },
      );
    }
  }
}

从上面的代码中,可以点击每个图块(容器),并调用otherTap()方法。 otherTap()方法显示一个简单的对话框(弹出窗口),其中包含所窃取容器的详细信息。
下面是otherTap()的代码。

class otherTap extends StatefulWidget{
  otherTap({Key key, @required this.idx}) : super(key: key);
  final int idx;
  @override
  _otherTapState createState() => new _otherTapState();
}

class _otherTapState extends State<otherTap>{
  @override
  Widget build(BuildContext context){
  _isDialogShowing = true;
       return SimpleDialog(
        title: Text(otherVessels[widget.idx]["shipName"]),
        children: <Widget>[
          SimpleDialogOption(
            child: Text('MMSI : ' + otherVessels[widget.idx]['MMSI']),
          )
        ],
      );
  }
}

我有一个全局布尔变量(_isDialogShowing)以跟踪对话框是否显示。
现在我想让showdialog(弹出窗口)在5秒后消失。
我使用Navigator.pop()关闭MyApp函数中的对话框。我将其放在setstate()函数中。

void main() {
  runApp(
    MyApp(storage: CounterStorage()),
  );
}

class MyApp extends StatefulWidget {
  MyApp({Key key, @required this.storage}) : super(key: key);
  final CounterStorage storage;
  @override
  State<StatefulWidget> createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
  final appTitle = 'Testing applicatin';

  void _update(BuildContext context) async {
    await Future.delayed(Duration(milliseconds: 5000));

    setState(() {
      if(_isDialogShowing){
        _isDialogShowing = false;
         Navigator.pop(context);
         //Navigator.of(context).pop();
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    _update(context);
    return new WillPopScope(
      onWillPop:  null,
      child: new MaterialApp(
        debugShowCheckedModeBanner: false,
        title: appTitle,
        home: MyHomePage(title: appTitle),
        routes: {
          Routes.home: (context) => MyHomePage(),
          Routes.settings: (context) => SettingsPage(),
        },
      ),
    );
  }
}

但是,上面的navigator.pop方法不会关闭弹出窗口。
有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

您需要在showDialog()的构建器中收到的上下文上调用pop,只有这样,对话框才会弹出该showDialog()创建的对话框。

将以下内容替换为showDialog(),它将为您工作:

showDialog(
  context: context,
  builder: (BuildContext context) {
    Future.delayed(Duration(seconds: 5)).then((_) {
      Navigator.pop(context);
    });
    return otherTap(idx:index);
  },
);