为啥 Navigator.pushNamed(context, "route");在我的 flutter-cupertino-app 代码示例中工作?

Posted

技术标签:

【中文标题】为啥 Navigator.pushNamed(context, "route");在我的 flutter-cupertino-app 代码示例中工作?【英文标题】:Why doesn't Navigator.pushNamed(context, "route"); work in my flutter-cupertino-app code example?为什么 Navigator.pushNamed(context, "route");在我的 flutter-cupertino-app 代码示例中工作? 【发布时间】:2020-09-20 18:22:17 【问题描述】:

这是我的第一个问题,我希望它是可读的。 我创建了一个示例颤振项目,其中说明了我的问题中指定的问题。 如果代码在 android 上运行,AndroidAppVersion-Object 会创建一个 Material App,其中包含一个带有红色 Scaffold 的 AndroidHomeScreen-Object 和一个标题为“Android”的 Button。当用户按下按钮时,将出现包含橙色 Scaffold 的 AnotherPageView-Object。 AnotherPageView-Object 只是一个示例页面。 如果平台不是 Android,则 (ios-)Cupertino-App 将由 IOSAppVersion-Object 创建,该对象包含带有绿色脚手架的 IOSHomeScreen 和标题为“IOS”的按钮。用户再次按下按钮以创建另一个页面视图对象。

所以问题来了: 当我使用Navigator.pushNamed(context, AnotherPageView.anotherPage); 该代码不起作用,它给了我我在下面添加的错误。 但是,如果我使用它,它会起作用

Navigator.push(context,
    CupertinoPageRoute(builder: (context) => AnotherPageView()));

但我想知道为什么它不适用于第一个。

代码:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'dart:io';

void main() 
  runApp(Platform.isAndroid ? IOSAppVersion() : AndroidAppVersion());


class AndroidAppVersion extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      routes: 
        AnotherPageView.anotherPage: (context) 
          return AnotherPageView();
        
      ,
      home: AndroidHomeScreen(),
    );
  


class AndroidHomeScreen extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      backgroundColor: Colors.red,
      body: MaterialButton(
        onPressed: () 
          Navigator.pushNamed(context, AnotherPageView.anotherPage);
        ,
        child: Center(
          child: Text('Android'),
        ),
      ),
    );
  


class IOSAppVersion extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return CupertinoApp(
      home: IOSHomeScreen(),
    );
  


class IOSHomeScreen extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      backgroundColor: Colors.green,
      body: CupertinoButton(
        child: Center(child: Text('Hallo IOS')),
        onPressed: () 
          Navigator.pushNamed(context, AnotherPageView.anotherPage);
        ,
      ),
    );
  


class AnotherPageView extends StatelessWidget 
  static String anotherPage = "anotherPage";
  @override
  Widget build(BuildContext context) 
    return Scaffold(
      backgroundColor: Colors.orange,
    );
  

这是显示的错误:

在处理手势时抛出以下断言: 在 _WidgetsAppState 中找不到路由 RouteSettings("anotherPage", null) 的生成器。 按以下顺序搜索路线的生成器:

    对于“/”路由,使用“home”属性(如果非空)。 否则,如果“路由”表有路由条目,则使用它。 否则,将调用 onGenerateRoute。对于任何未被“home”和“routes”处理的有效路由,它应该返回一个非空值。 最后如果一切都失败了 onUnknownRoute 被调用。 不幸的是,未设置 onUnknownRoute。

...

【问题讨论】:

【参考方案1】:

这个

return CupertinoApp(
  home: IOSHomeScreen(),
);

不知道任何路线,你需要提供你的路线到materialapp和cupertinoapp,就做

return CupertinoApp(
      routes: 
        AnotherPageView.anotherPage: (context) 
          return AnotherPageView();
        
      ,
      home: IOSHomeScreen(),
    );

【讨论】:

以上是关于为啥 Navigator.pushNamed(context, "route");在我的 flutter-cupertino-app 代码示例中工作?的主要内容,如果未能解决你的问题,请参考以下文章

将 BlocListener 与 Navigator PushNamed 一起使用会导致歧义

Flutter 中的命名路由如何消除重复?

Flutter appBar后退按钮不出现

在 webview 中颤动水平滑动手势

showBottomSheet 抛出错误,抱怨没有脚手架

使用命名路由导航时找不到流提供程序