簡體   English   中英

為什么“使用不包含導航器的上下文請求導航器操作”

[英]WHY "Navigator operation requested with a context that does not include a Navigator"

我知道如何解決問題,但我不知道為什么會這樣:

我有一個有 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刪除,如下所示:

主要.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

如評論中所述,此問題似乎與此帖子重復: “使用不包含導航器的上下文請求的導航器操作”

之所以拋出錯誤,是因為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)));
  }
}

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM