【问题标题】:flutter: Another exception was thrown: No MaterialLocalizations found颤振:引发了另一个异常:未找到 MaterialLocalizations
【发布时间】:2019-04-27 08:47:09
【问题描述】:

我试图在 Flutter 中按下按钮时显示警报对话框。 以下是我的代码

main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Different Widgets",
      debugShowCheckedModeBanner: false,
      home: showAlertDialog()
      );
  }

  void _dialogResult(String value) {
    if (value == "YES") {
      print("YES");
    } else {
      print("NO");
    }
    Navigator.pop(context);
  }

  Widget showAlertDialog() {
    TextEditingController textEditingController = TextEditingController();

    return Scaffold(
      appBar: AppBar(
        title: Text("Different Widgets"),
      ),
      body: Container(
        child: Center(
          child: Column(
            children: <Widget>[
              TextField(
                controller: textEditingController,
              ),
              RaisedButton(
                onPressed: () {
                  print("Hi");
                  AlertDialog dialog = AlertDialog(
                    title: Text("Hi"),
                    content: Text(
                      textEditingController.text,
                      style: TextStyle(fontSize: 30.0),
                    ),
                    actions: <Widget>[
                      FlatButton(
                          onPressed: () {
                            _dialogResult("YES");
                          },
                          child: Text("YES")),
                      FlatButton(
                          onPressed: () {
                            _dialogResult("NO");
                          },
                          child: Text("NO")),
                    ],
                  );

                  showDialog(context: context, builder: (BuildContext context) => dialog);
                },
                child: Text("Click Me"),
              )
            ],
          ),
        ),
      ),
    );
  }

这与本地化有什么关系,我无法理解。我按照文档执行了相同的步骤。我能够看到该按钮,但单击该按钮时,我不断收到错误消息。我尝试在按钮单击中编写打印语句,打印语句出现在日志中,肯定是 AlertDialog 有问题。

【问题讨论】:

  • 你能告诉我们你的 MaterialApp 吗?
  • @RémiRousselet 我已经添加了整个代码。请检查已编辑的问题
  • 尝试将showAlertDialog提取到小部件而不是函数中
  • @RémiRousselet 尝试这样做但不起作用

标签: flutter android-alertdialog


【解决方案1】:

在 Flutter 中使用 showDialog() 类显示对话框时,您可能会收到 No MaterialLocalizations found 错误。问题是将子小部件放在MaterialApp() 小部件的home 属性上而不创建新的小部件类。

一种解决方法是将MaterialApp() 放入runApp() 并为home 属性创建新类。

import 'package:flutter/material.dart';

main() {
  runApp(
    MaterialApp(
      home: MyApp(),
      title: "Different Widgets",
      debugShowCheckedModeBanner: false,
    ),
  );
}

/*
place MaterialApp() widget on runApp() and create
new class for its 'home' property
to escape 'No MaterialLocalizations found' error
*/

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return showAlertDialog();
  }

  void _dialogResult(String value) {
    if (value == "YES") {
      print("YES");
    } else {
      print("NO");
    }
    Navigator.pop(context);
  }

  Widget showAlertDialog() {
    TextEditingController textEditingController = TextEditingController();

    return Scaffold(
      appBar: AppBar(
        title: Text("Different Widgets"),
      ),
      body: Container(
        child: Center(
          child: Column(
            children: <Widget>[
              TextField(
                controller: textEditingController,
              ),
              RaisedButton(
                onPressed: () {
                  print("Hi");
                  AlertDialog dialog = AlertDialog(
                    title: Text("Hi"),
                    content: Text(
                      textEditingController.text,
                      style: TextStyle(fontSize: 30.0),
                    ),
                    actions: <Widget>[
                      FlatButton(
                          onPressed: () {
                            _dialogResult("YES");
                          },
                          child: Text("YES")),
                      FlatButton(
                          onPressed: () {
                            _dialogResult("NO");
                          },
                          child: Text("NO")),
                    ],
                  );

                  showDialog(
                      context: context,
                      builder: (BuildContext context) => dialog);
                },
                child: Text("Click Me"),
              )
            ],
          ),
        ),
      ),
    );
  }
}

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2020-12-09
    • 2020-12-29
    • 2021-10-23
    • 1970-01-01
    相关资源
    最近更新 更多