![](/img/trans.png)
[英]Navigator operation requested with a context that does not include a Navigator.(Flutter)
[英]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.