Dart 在小部件上显示对话框
在flatter中,我们希望在小部件上方覆盖一个对话框 我们能够在按下按钮后显示对话框 但是,我们希望在显示喜欢加载对话框的小部件时显示该对话框 我们执行了以下步骤Dart 在小部件上显示对话框,dart,flutter,Dart,Flutter,在flatter中,我们希望在小部件上方覆盖一个对话框 我们能够在按下按钮后显示对话框 但是,我们希望在显示喜欢加载对话框的小部件时显示该对话框 我们执行了以下步骤 import 'package:flutter/material.dart'; class XxxxxWidget extends StatelessWidget { @override Widget build(BuildContext context) { // [NG]We want to show dial
import 'package:flutter/material.dart';
class XxxxxWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
// [NG]We want to show dialog on Container widget.
// showMyDialog(context);
return Container(
child: FlatButton(
child: Text('Show'),
onPressed: () {
// [OK]We can show dialog.
showMyDialog(context);
},
),
);
}
void showMyDialog(BuildContext context) {
showDialog<bool>(
context: context,
builder: (BuildContext context) {
return AlertDialog(
content: const Text(
'Message',
),
actions: <Widget>[
FlatButton(
child: const Text('OK'),
onPressed: () {
Navigator.of(context).pop(true);
},
),
],
);
},
);
}
}
我们已经安装了颤振扩展。
但颤振医生说没有安装。
这对于这个问题并不重要。您的问题是正常的颤振,让我们看看代码 我猜问题出在小部件的构造函数中,需要如下所示:
showMyDialog(BuildContext context) {
showDialog(
context: context,
builder: (BuildContext context){
return new AlertDialog(
content: Text(
'Message Here',
),
actions: <Widget>[
FlatButton(
child: const Text('OK'),
onPressed: () {
Navigator.of(context).pop(true);
},
),
],
);
}
);
}
showMyDialog(构建上下文){
显示对话框(
上下文:上下文,
生成器:(BuildContext上下文){
返回新警报对话框(
内容:文本(
“留言在这里”,
),
行动:[
扁平按钮(
子项:常量文本('OK'),
已按下:(){
Navigator.of(context.pop)(true);
},
),
],
);
}
);
}
试试这个我们必须在构建小部件时显示一次对话框。 您可以像下面那样使用Future.delayed功能(I已测试,它正在工作) 解释: 由于Dart基于单线程事件循环,当我们创建异步任务时,它将把这些事件放在事件队列的末尾,并继续当前的执行。请参考以下示例了解更多详细信息
void main() {
print("first");
Future(() => print("second"));
print("third");
Future(() => print("forth"));
}
输出将是
first
third
second
forth
这与
DispatchQueue.main.async {
print("Async1") //printJob
}
完成
构建小部件后
显示对话框
。请查看my以了解类似的问题。有些问题不明确,但您可以在widgets init方法中显示一个警报对话框,如下所示
Future showDialog() async {
WidgetsBinding.instance.addPostFrameCallback((_) async {
await showDialog<String>(
context: context,
builder: (BuildContext context) => AlertDialog(
title: const Text('Title'),
content: const Text('Content')
actions: <Widget>[
FlatButton(
child: const Text('OK'),
onPressed: () {
Navigator.of(context).pop();
},
),
],
),
);
});
}
执行此操作的“颤振方式”如下所示(假设在渲染主屏幕时需要执行此操作):
类MyWidgetWithDialogOnStartup扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回安全区(
孩子:未来建设者(
future:future.delayed(Duration.zero,()=>showMyDialog(context)),
生成器:(上下文,快照){
返回WhateverMyWidgetReallyIs();
},
)
);
}
}
showMyDialog(context)
包装本机showDialog
调用。“未安装颤振扩展;从安装”是此颤振版本中的已知问题,可以安全忽略。感谢您的回复。我们已经知道了。:)我们正在使用beta分支。有点旧了。我们是否应该使用不同的版本或主分支来发布该应用程序?我们感谢您的及时回复。我们能够按预期显示对话框。你节省了我们的时间。我们之前尝试Future.delayed()时,未显示对话框。我们可能犯了一些其他的错误。我在这里也提到了类似的问题:警报会显示,但每当构建执行时它会显示多次。即使取消ok,它也会推动另一个。我如何确保在这种情况下,屏幕上只显示一个警报或类似的方法会有所帮助。我们感谢您的及时回复。BuilderContext是BuildContext的输入错误吗?我们将其固定为BuildContext,但答案与我们尝试的相同。因此,显示了相同的错误。这可能只是因为我们的知识缺失。我们需要你更详细的回答。
first
third
second
forth
DispatchQueue.main.async {
print("Async1") //printJob
}
Future showDialog() async {
WidgetsBinding.instance.addPostFrameCallback((_) async {
await showDialog<String>(
context: context,
builder: (BuildContext context) => AlertDialog(
title: const Text('Title'),
content: const Text('Content')
actions: <Widget>[
FlatButton(
child: const Text('OK'),
onPressed: () {
Navigator.of(context).pop();
},
),
],
),
);
});
}
@override
void initState() {
super.initState();
showDialog();
}