如何确保对话框仅出现在Flutter中调用“showDialog”函数的屏幕上

dm7nw8vv  于 2023-03-24  发布在  Flutter
关注(0)|答案(1)|浏览(171)

我有两个屏幕A和B。我目前在屏幕A上,我调用了一个函数,该函数在10秒后显示一个对话框。问题是,当我在对话框出现之前导航到屏幕B时,对话框出现在屏幕B而不是A上,即使我使用了_scaffoldKey. currentContext。

showDialog(
      context: _scaffoldKey.currentContext!,
      builder: (ctx) {
        return Widget();
      },
    )

如何确保对话框只出现在屏幕A上?

tgabmvqs

tgabmvqs1#

阿雄
这个问题可能是由于在调用showDialog方法时传入了_scaffoldKey的当前context。但是,如果在对话框出现之前将navigate传递到屏幕B,则currentcontext可能不再引用屏幕A。
一种方法是用Builder Package 小部件,而不是显式地依赖于_scaffoldKey.currentContext

class ScreenA extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Builder(
        builder: (BuildContext context) {
          return Center(
            child: ElevatedButton(
              child: Text('Show Dialog'),
              onPressed: () {
                Future.delayed(Duration(seconds: 10), () {
                  showDialog(
                    context: context, // Pass in the context of the Builder widget
                    builder: (ctx) {
                      return AlertDialog(
                        title: Text('Dialog'),
                        content: Text('This dialog will always appear on Screen A'),
                        actions: [
                          TextButton(
                            child: Text('OK'),
                            onPressed: () {
                              Navigator.of(ctx).pop();
                            },
                          ),
                        ],
                      );
                    },
                  );
                });
              },
            ),
          );
        },
      ),
    );
  }
}

希望对你有帮助,还有context的基本定义,让你的头脑更清晰,

  • 上下文是指向小部件树结构中小部件位置的链接。-上下文只能属于一个小部件。-如果小部件具有子小部件,则父小部件的上下文成为直接子元素上下文的父上下文。

相关问题