我想根据条件显示alert 对话框.不基于用户交互,例如按钮按下事件.

如果在应用程序状态中设置了标志,则会显示数据警告对话框,否则不会显示.

下面是我想展示的示例alert 对话框

  void _showDialog() {
    // flutter defined function
    showDialog(
      context: context,
      builder: (BuildContext context) {
        // return object of type Dialog
        return AlertDialog(
          title: new Text("Alert Dialog title"),
          content: new Text("Alert Dialog body"),
          actions: <Widget>[
            // usually buttons at the bottom of the dialog
            new FlatButton(
              child: new Text("Close"),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }

我试图在主屏幕小部件的build方法中调用该方法,但它给出了错误-

 The context used to push or pop routes from the Navigator must be that of a widget that is a descendant of a Navigator widget.
E/flutter ( 3667): #0      Navigator.of.<anonymous closure> (package:flutter/src/widgets/navigator.dart:1179:9)
E/flutter ( 3667): #1      Navigator.of (package:flutter/src/widgets/navigator.dart:1186:6)
E/flutter ( 3667): #2      showDialog (package:flutter/src/material/dialog.dart:642:20)

问题是我不知道应该从哪里调用_showDialog方法?

推荐答案

我会把它放在State(StatefulWidget)中的initState.

将其放在Stateless小部件的build方法中是很诱人的,但这会多次触发您的alert .

在下面的示例中,当设备没有连接到Wifi时,它会显示一个alert ,如果没有连接到Wifi,则会显示[重试]按钮.

import 'package:flutter/material.dart';
import 'package:connectivity/connectivity.dart';

void main() => runApp(MaterialApp(title: "Wifi Check", home: MyPage()));

class MyPage extends StatefulWidget {
    @override
    _MyPageState createState() => _MyPageState();
}

class _MyPageState extends State<MyPage> {
    bool _tryAgain = false;

    @override
    void initState() {
      super.initState();
      _checkWifi();
    }

    _checkWifi() async {
      // the method below returns a Future
      var connectivityResult = await (new Connectivity().checkConnectivity());
      bool connectedToWifi = (connectivityResult == ConnectivityResult.wifi);
      if (!connectedToWifi) {
        _showAlert(context);
      }
      if (_tryAgain != !connectedToWifi) {
        setState(() => _tryAgain = !connectedToWifi);
      }
    }

    @override
    Widget build(BuildContext context) {
      var body = Container(
        alignment: Alignment.center,
        child: _tryAgain
          ? RaisedButton(
              child: Text("Try again"),
              onPressed: () {
                _checkWifi();
            })
          : Text("This device is connected to Wifi"),
      );

      return Scaffold(
        appBar: AppBar(title: Text("Wifi check")),
        body: body
      );
    }

    void _showAlert(BuildContext context) {
      showDialog(
          context: context,
          builder: (context) => AlertDialog(
            title: Text("Wifi"),
            content: Text("Wifi not detected. Please activate it."),
          )
      );
    }
}

Flutter相关问答推荐

如何在flutter中获得类似属性的float(CSS属性)

Flutter FireRestore:如何从特定/实际领域获取数据

MobX Build_Runner问题:不生成.G文件(Flutter )

Flutter 对齐:不适用于多行文字

Flutter AppBar Animation反向调试

为什么Flutter 翼扩展卡有上下边框?

如何将assets资源 实体类型转换为文件类型?

在LinkedIn上分享Fighter和Web的链接会产生不同的结果

如何在Date Time类中只显示日期?

为Android生成时出现Flutter 错误:给定资源值的<;COLOR&>无效

Flutter中的编译时间常量方法

Dart 和 flutter 错误无法在您的 PATH 中找到 git

无法使用 bloc 更新 ListView.builder 的特定时间

Flutter/Riverpod 创建复杂对象的副本,其值在某处发生变化

Flutterfire Configure - 未处理的异常和没有 firebase 初始化

在 flutter 的另一个类中使用变量值

按下 Command+W 时关闭窗口

Positioned 的宽度或 SizedBox 的宽度都不适用于堆栈小部件 - Flutter

Flutter 中的 Firebase 后台消息处理程序产生重复的隔离并运行应用程序两次

我收到这个错误我无法解决