Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 在小部件上显示对话框_Dart_Flutter - Fatal编程技术网

Dart 在小部件上显示对话框

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

在flatter中,我们希望在小部件上方覆盖一个对话框

我们能够在按下按钮后显示对话框

但是,我们希望在显示喜欢加载对话框的小部件时显示该对话框

我们执行了以下步骤

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();
}