Ошибка «context! = Null: is true» при попытке показать диалог после MaterialPageRoute в Flutter? - PullRequest
0 голосов
/ 19 апреля 2020

В настоящее время я могу MaterialRoute перейти на страницу из Home App во Flutter, а также показать всплывающий диалог. Однако при маршрутизации от этой второй страницы к третьей странице, которая содержит кнопку, которая должна показывать диалог, я получаю эту ошибку: [VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: 'package:flutter/src/widgets/localizations.dart': Failed assertion: line 446 pos 12: 'context != null': is not true.

ShowDialogue, который вызывает эту ошибку, выглядит так:


class ThirdPageWidgetState extends State<ThirdPageWidget> {

  StreamSubscription<ScanResult> scanSubscription;

  @override
  void initState() {
    super.initState();
  }
Future<void> alert(deviceName) async {
    return showDialog<void>(
      barrierDismissible: false, // user must tap button!
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('Button Pressed!'),
          content: SingleChildScrollView(
            child: ListBody(
              children: <Widget>[
                Text('test'),
              ],
            ),
          ),
          actions: <Widget>[
            FlatButton(
              child: Text('Ok'),
            ),
          ],
        );
      },
    );
  }

  'Build function omitted'
}

А маршрутизация второй страницы на третью страницу выглядит следующим образом:

void routeAppToThirdPage() async {
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => ThirdPageWidget(),
      ),
    );
  }

Ответы [ 3 ]

1 голос
/ 19 апреля 2020

Стандартные диалоги флаттера требуют BuildContext. Вы можете отправить по параметру, и у вас не будет больше ошибок. Однако, если вы хотите сэкономить время разработки или вам не нравится идея отправки контекста по параметру, вы можете просто использовать эту библиотеку, которая позволяет вам перемещаться по маршрутам, открывать диалоги и закусочные из любого места в коде, без необходимости контекста.

https://pub.dev/packages/get

В вашем примере ваш код тоже будет меньше:

Для перехода к следующему маршруту:

Get.to(ThirdPageWidget());

Открыть диалог:

   Get.dialog(
    AlertDialog(
        title: Text('Button Pressed!'),
        content: SingleChildScrollView(
            child: ListBody(
          children: <Widget>[
            Text('test'),
          ],
        ))),
    barrierDismissible: false,
  );
1 голос
/ 19 апреля 2020

Причина, по которой вы получаете эту ошибку, заключается в том, что вы не передаете BuildContext в showDialog, вам придется изменить.

 Future<void> alert(deviceName, context) async {...}
//Then when you call your function in your build function you would pass in context
await alert(deviceName, context);
0 голосов
/ 19 апреля 2020

showDialogue<void>() требуется параметр context:context, который не был перехвачен компилятором.

return showDialog<void>(
      context: context // THIS WAS MISSING
      barrierDismissible: false, // user must tap button!
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('Button Pressed!'),
          content: SingleChildScrollView(
            child: ListBody(
              children: <Widget>[
                Text('test'),
              ],
            ),
          ),
          actions: <Widget>[
            FlatButton(
              child: Text('Ok'),
            ),
          ],
        );
    ```
...