Flutter Navigator不工作

cyej8jka  于 2023-05-23  发布在  Flutter
关注(0)|答案(8)|浏览(170)

我有两个屏幕的应用程序,我想通过按下按钮从第一个屏幕推到第二个屏幕。

屏幕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"),
      ),
    );
  }
}

推不发生,我得到了这个
处理手势时引发了以下Assert:使用不包括导航器的上下文请求导航器操作。用于从导航器推送或弹出路由的上下文必须是导航器小部件的子小部件的上下文。
抛出了另一个异常:使用不包括导航器的上下文请求导航器操作。
怎么了?

70gysomp

70gysomp1#

将Flutter中的小部件想象成一棵树,上下文指向使用build函数构建的任何节点。在你的情况下,你有

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

因此,当您使用上下文来查找导航器时,您使用的是不在导航器下的主屏幕上下文。
您可以创建一个新的Stateless或Stateful Widget子类来包含Center + FlatButton,因为其中的构建函数将指向该级别,或者您可以使用Builder并定义builder回调(它具有指向Builder的上下文)以返回Center + FlatButton。

zaqlnxep

zaqlnxep2#

只需将main方法中的MaterialApp类作为本例

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

对我来说很好,我希望对你也能起作用

a1o7rhls

a1o7rhls3#

找不到路由的主要原因有两个。
1)路由定义在传递给导航器的上下文之下。of(context)-@rmtmackenzie已经解释过的场景
2)路由在同级分支上定义***,例如

Root 

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

  -> Navigation (we want to dispatch from here)

如果我们想从Navigation小部件分派一个路由,我们必须知道NavigatorState的引用。拥有全局引用是非常昂贵的,尤其是当您打算在树中移动小部件时。https://docs.flutter.io/flutter/widgets/GlobalKey-class.html。仅在无法从Navigator.of(context)获取的情况下使用它。
要在MaterialApp中使用GlobalKey,请定义navigatorKey

final navigatorKey = GlobalKey<NavigatorState>();

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

现在,在应用程序中传递navigatorKey的任何地方都可以调用

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

关于X1 E1 F1 X

vojdkbi0

vojdkbi04#

有一个关于这个问题的另一个非常不同的工作,如果你使用闹钟管理器(Android),并打开回到您的应用程序.如果您在导航之前没有打开屏幕,导航器将永远无法工作。虽然这是一个罕见的用法,我认为这应该是一个值得知道的。

lkaoscv7

lkaoscv75#

确保路由表在相同的上下文中提到:

@override
Widget build(BuildContext context) {
    
    return MaterialApp(
        home: FutureBuilder(
            future: _isUserLoggedIn(),
            builder: (ctx, loginSnapshot) => 
                loginSnapshot.connectionState == ConnectionState.waiting ?
                    SplashScreen() : loginSnapshot.data == true ? AppLandingScreen(): SignUpScreen()
        ),
        routes: {
            AppLandingScreen.routeName: (ctx) => AppLandingScreen(),
        },
    );
}

我遇到这个问题是因为我在不同的构建方法中定义了路由表。

tez616oj

tez616oj6#

我是一个新手,已经花了两天的时间试图克服导航对象链接到一个黑色的屏幕。
导致此问题的原因是重复的虚拟数据。找到Bellow两个dummny数据块:

**Problematic data **- duplicate assets/image:

_buildFoodItem('assets/plate1.png', 'Salmon bowl', '\$24'),
_buildFoodItem('assets/plate2.png', 'Spring bowl', '\$13'),
_buildFoodItem('assets/plate1.png', 'Salmon bowl', '\$24'),
_buildFoodItem('assets/plate5.png', 'Berry bowl', '\$34'),

**Solution **- after eliminating duplicated image argument:
_buildFoodItem('assets/plate1.png', 'Salmon bowl', '\$24'),
_buildFoodItem('assets/plate2.png', 'Spring bowl', '\$13'),
_buildFoodItem('assets/plate6.png', 'Avocado bowl', '\$34'),

我希望这能帮到某人,,,,

avkwfej4

avkwfej47#

对我来说,我在MaterialApp上将navigatorKey设置为错误字段

final navigatorKey = GlobalKey<NavigatorState>();
class MyApp extends StatelessWidget {

  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // key: navigatorKey, <-- wrong 
      navigatorKey: navigatorKey, // <-- correct
    );
  }
}
pxiryf3j

pxiryf3j8#

如果导航器不工作,可能是由于许多原因,但主要原因是导航器没有找到上下文。因此,为了解决这个问题,请尝试将您的小部件 Package 在Builder中,因为构建器有自己的上下文...

相关问题