【问题标题】:WHY "Navigator operation requested with a context that does not include a Navigator"为什么“使用不包含导航器的上下文请求导航器操作”
【发布时间】:2019-04-01 21:56:46
【问题描述】:

我知道如何解决问题,但我不知道为什么会这样:

我有一个有 2 个屏幕的应用:

这个 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();
  }
}

HomeActivity.Dart:

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 中删除,如下所示:

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 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 应用程序时,它可以正常工作,没有任何问题。

所以我的问题是为什么会发生这种情况?在这两种方式中,我都有一个Material app,里面有一个Scaffold

【问题讨论】:

标签: dart flutter navigator


【解决方案1】:

如 cmets 中所述,此问题似乎与此帖子重复:"Navigator operation requested with a context that does not include a Navigator"

抛出错误的原因是因为Navigator无法从MaterialApp访问Navigator。要解决此问题,您可以声明 MaterialApp 并初始化 HomeActivity - 就像您正在做的那样,或者您可以在 HomeActivity 中初始化 MaterialApp 后添加Builder

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)));
  }
}

【讨论】:

    猜你喜欢
    • 2021-09-12
    • 2021-02-23
    • 2020-09-01
    • 2019-05-16
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    相关资源
    最近更新 更多