ПОЧЕМУ операция Navigator запрошена с контекстом, который не включает Navigator

Я знаю, как решить проблему, но я не знаю, почему это происходит:

У меня есть приложение с двумя экранами:

Этот main.dart:

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

void main() {
  runApp(App());
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new HomeActivity();
  }
}

ГлавнаяАктивность.Дарт:

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

class HomeActivity extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        appBar: AppBar(title: new Text("Home")),
        floatingActionButton: FloatingActionButton(
            onPressed: () => Navigator.push(context, new MaterialPageRoute(builder: (context) => new AddGameActivity())),
            child: new Icon(Icons.add))),
    );
  }

Итак, здесь у меня есть экран с кнопкой FAB, чтобы перейти к AddGameActivity, когда я нажимаю кнопку FAB, это сообщение об ошибке:

операция навигатора запрошена с контекстом, который не включает навигатор

Теперь, чтобы решить эту проблему, я добавил MaterialApp к main.dart и удалил его из HomeActivity.dart следующим образом:

основной.дротик:

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

void main() {
  runApp(App());
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(home: HomeActivity());
    }
}

ГлавнаяАктивность:

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

class HomeActivity extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: AppBar(title: new Text("Home")),
        floatingActionButton: FloatingActionButton(
            onPressed: () => Navigator.push(context, new MaterialPageRoute(builder: (context) => new AddGameActivity())),
            child: new Icon(Icons.add)));
  }
}

В этом случае, когда я добавляю приложение «Материал» в main.dart, оно работает без проблем.

Итак, мои вопросы: ПОЧЕМУ это происходит? в обоих случаях у меня есть Material app, внутри которого есть Scaffold!


person Yousef Gamal    schedule 29.10.2018    source источник
comment
Проверьте этот отличный ответ от Рейми: stackoverflow.com/a/51292613/666221   -  person diegoveloper    schedule 29.10.2018
comment
@diegoveloper Итак, если я правильно понял: в этом случае во втором примере, когда я вызываю HomeActivity() из main.dart, я передаю контекст из MaterialApp в main.dart для метода сборки в HomeAcitivty.dart, верно?   -  person Yousef Gamal    schedule 29.10.2018
comment
Да, это правильно   -  person diegoveloper    schedule 29.10.2018
comment
Хорошо, отлично, большое спасибо @diegoveloper   -  person Yousef Gamal    schedule 29.10.2018
comment
Возможный дубликат операции Navigator, запрошенный с помощью контекст, который не включает навигатор   -  person rmtmckenzie    schedule 29.10.2018


Ответы (1)


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

Причина, по которой возникает ошибка, заключается в том, что Navigator не может получить доступ к Navigator из MaterialApp. Чтобы решить эту проблему, вы можете либо объявить MaterialApp и инициализировать HomeActivity — например, то, что вы делаете, либо добавить Builder после инициализации MaterialApp внутри HomeActivity.

import 'package:flutter/material.dart';

void main() {
  runApp(App());
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return HomeActivity();
  }
}

class HomeActivity extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // call Builder to access Navigator from MaterialApp
      home: Builder(
        builder: (context) => Scaffold(
            appBar: AppBar(title: Text("Home")),
            floatingActionButton: FloatingActionButton(
                onPressed: () => Navigator.push(
                    context,
                    new MaterialPageRoute(
                        builder: (context) => AddGameActivity())),
                child: new Icon(Icons.add))),
      ),
    );
  }
}

class AddGameActivity extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
          appBar: AppBar(title: Text("AddGame")),
          floatingActionButton: FloatingActionButton(
              onPressed: () => Navigator.push(
                  context,
                  new MaterialPageRoute(
                      builder: (context) => new AddGameActivity())),
              child: new Icon(Icons.add)));
  }
}

Демонстрация

person Omatt    schedule 09.11.2020