【问题标题】:Trying to use showDialog()/show Pop up on app startup尝试在应用启动时使用 showDialog()/show Pop up
【发布时间】:2022-08-05 14:14:43
【问题描述】:
我想要达到的目标:我想在启动时打开一个弹出窗口来解释我的应用程序。
我的做法:据我通过谷歌搜索了解它,我应该使用 showDialog() 方法。最基本的形式:
showDialog(
context: context,
builder: (context) {
return Text(\'data\');
});
我尝试返回实际的对话框(例如 AlertDialog),但它不会改变行为,所以我现在只是使用带有字符串的 Text() 作为占位符。
问题:
无论我将 showDialog 函数放在哪里,它都无法按预期工作(另请参见下面的屏幕截图):
-
将其置于 initState:我收到一条关于在 initState 完成之前调用继承的小部件的错误消息 + 关于依赖项的解释,我几乎无法理解。
-
将它放在构建方法中:我收到一条错误消息,说明当应用程序已经在构建小部件时调用了 setState() 或 markNeedsBuild()。
-
把它放在 DidChangeAppLifeCycleState():当我暂停应用程序然后恢复它时,这实际上正在工作并打开弹出窗口。虽然它没有在应用程序启动时打开。
-
将其包装在 WidgetsBinding.instance!.addPostFrameCallback():我在这里提出的一个想法:How to show a popup on app start in Flutter。在 initState 和 build 中都不会改变错误消息的结果。
有任何想法吗?
截图:
从初始化状态:
从构建方法:
来自 DidChangeAppLifecycleState(“成功”变体:
标签:
flutter
popup
flutter-alertdialog
flutter-dialog
【解决方案1】:
请您在您的 init 方法中尝试以下代码吗?我希望这可能会奏效。
Future.delayed(Duration.zero, () async {
myFunction();
});
【解决方案2】:
在第一帧完成后,在initState 中使用WidgetsBinding.instance.addPostFrameCallback 执行其内部任务。
addPostFrameCallback 在此帧结束时安排回调。
下一个问题是没有材料。您可以在builder 上直接返回AlertDialog 或使用Material、Scaffold 等任何材质小部件进行包装。
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
showDialog(
context: context,
builder: (context) {
return const AlertDialog(
content: Text('data'),
);
},
);
});
}
如果您正在运行版本<3 null 安全,请使用 WidgetsBinding.instance?.addPostFrameCallback
【解决方案3】:
使用 WidgetsBinding.instance!.addPostFrameCallback() 的方法之一可以正常工作。
如果您通过按下按钮也显示正常的显示对话框,它将产生相同的结果。
在这里,您需要根据需要将文本(“数据”)包装在对话框小部件中,例如 alertDialog 或 simpleDialog 小部件,它将在当前脚手架中显示对话框 -
WidgetsBinding.instance!.addPostFrameCallback((_) async {
return await showDialog(
context: context,
builder: (context) {
return AlertDialog(
content: Text("data"),
);
});
});
我尝试在初始化状态下添加它,当我重新启动应用程序时弹出对话框很好
【解决方案4】:
非常感谢你的回答。我通过重写您的建议解决了这个问题;它有效。我认为问题在于我的 WidgetsBinding 代码中没有 _ 或其他任何内容。所以我做了:
WidgetsBinding.instance?.addPostFrameCallback(() {})
代替
WidgetsBinding.instance?.addPostFrameCallback((_) {})