Флаттер навигатор не работает - PullRequest
0 голосов
/ 02 мая 2018

У меня есть приложение с двумя экранами, и я хочу нажать от 1-го до второго экрана нажатием кнопки.

Экран 1

import 'package:flutter/material.dart';
import './view/second_page.dart';

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

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

class MainScreen extends State<MyApp> {

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

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
        home: new Scaffold(
            appBar: new AppBar(
                title: new Text("Title")
            ),
            body: new Center(
                child: new FlatButton(child: new Text("Second page"),
                    onPressed: () {
                      Navigator.push(context,
                          new MaterialPageRoute(
                              builder: (context) => new SecondPage()))
                    }
                )
            )
        )
    );
  }
}

Экран 2

import 'package:flutter/material.dart';

class SecondPage extends StatefulWidget {

  @override
  State<StatefulWidget> createState() {
    return new SecondPageState();
  }
}


class SecondPageState extends State<SecondPage> {

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

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Title"),
      ),
      body: new Center(
        child: new Text("Some text"),
      ),
    );
  }
}

Толчок не происходит, и я получил это

При обработке жеста было выдвинуто следующее утверждение: Навигатор операция запрашивается с контекстом, который не включает в себя навигатор. Контекст, используемый для перемещения или извлечения маршрутов из навигатора, должен быть таким виджета, который является потомком виджета Navigator.

Вышло еще одно исключение: операция навигатора запрошена с контекст, который не включает в себя навигатор.

Что не так?

Ответы [ 4 ]

0 голосов
/ 22 мая 2019

Существует еще один совершенно другой способ решения этой проблемы: если вы используете Alarm Manager (Android) и открываете свое приложение. Если вы не включили экран перед навигацией, навигатор никогда не будет работать. Хотя это редкое использование, я думаю, это стоит знать.

0 голосов
/ 29 мая 2018

Существует две основные причины, по которым маршрут не может быть найден.

1) Маршрут определен ниже контекста , переданного в Navigator.of (context) - сценарий, который @rmtmackenzie объяснил

2) Маршрут определен в ветви филиала например.

Root 

  -> Content (Routes e.g. Home/Profile/Basket/Search)

  -> Navigation (we want to dispatch from here)

Если мы хотим отправить маршрут из виджета «Навигация», мы должны знать ссылку на NavigatorState. Наличие глобальной ссылки стоит дорого, особенно когда вы собираетесь перемещать виджет по дереву. https://docs.flutter.io/flutter/widgets/GlobalKey-class.html. Используйте его только там, где нет способа получить его из Navigator.of (context).

Чтобы использовать GlobalKey внутри MaterialApp, определите navigatorKey

final navigatorKey = GlobalKey<NavigatorState>();

Widget build(BuildContext context) => MaterialApp {
    navigatorKey: navigatorKey
    onGenerateRoute : .....
};

Теперь в любом месте приложения, где вы передаете навигационную клавишу, вы можете теперь вызывать

navigatorKey.currentState.push(....);

Только что написал об этом https://medium.com/@swav.kulinski/flutter-navigating-off-the-charts-e118562a36a5

0 голосов
/ 16 июля 2018

просто создайте класс MaterialApp в методе main, как в этом примере

 void main() => runApp(MaterialApp(home: FooClass(),));

Это прекрасно работает для меня, Я надеюсь, что это будет работать

0 голосов
/ 02 мая 2018

Думайте о виджетах во Flutter как о дереве, с контекстом, указывающим на тот узел, который создается с помощью функции build. В вашем случае у вас есть

MainScreen    <------ context
  --> MaterialApp
   (--> Navigator built within MaterialApp)
      --> Scaffold
        --> App Bar
          --> ...
        --> Center
          --> FlatButton

Поэтому, когда вы используете контекст для поиска навигатора, вы используете контекст для главного экрана, который не находится под навигатором.

Вы можете либо создать новый подкласс Widget без состояния или с состоянием, чтобы он содержал ваш Center + FlatButton, так как функция построения внутри них будет указывать вместо этого на этот уровень, или вы можете использовать Builder и определить builder обратный вызов (который имеет контекст, указывающий на Builder) для возврата Center + FlatButton.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...