如何在Flutter中设置WidgetsApp的属性pageRouteBuilder

How to set the property pageRouteBuilder of WidgetsApp in Flutter

我试图了解 Flutter 中的导航如何在基本层面上工作,超越 Material 设计便利小部件,以实现非标准导航方案。

我一直在研究答案 中的代码,并将该代码的构建方法编辑如下,将 routespageRouteBuilder 属性设置为非空。

@override
 Widget build(BuildContext context) {
   return new WidgetsApp(
       onGenerateRoute: generate,
       pageRouteBuilder: (RouteSettings settings, WidgetBuilder builder) {
         return MaterialPageRoute(builder: (context) => Container(color: Colors.blue,));
         },
       onUnknownRoute: unKnownRoute,
       textStyle: const TextStyle(),
       initialRoute: "/",
       routes: <String, WidgetBuilder> {
         '/test': (BuildContext context) => Container(
           child: Text('test'), 
           color: Colors.green,
         ),
       },
       color: Colors.red);
 }

这会引发错误

Error: The argument type 'MaterialPageRoute Function(RouteSettings, Widget Function(BuildContext))' can't be assigned to the parameter type 'PageRoute Function(RouteSettings, Widget Function(BuildContext))'

(我原来用PageRoute widget代替了MaterialPageRoute widget,后来也收到abstract 类无法实例化的错误,所以改用Material PageRoute为了方便*,想象一下就是PageRoute的一个实现。

*而不是为这个玩具示例编写新的 PageRoute 实现。)

我不知道如何解决这个问题,据我所知,参数和参数类型是等价的,而且我找不到任何关于如何设置 pageRouteBuilder 属性在线。非常感谢解释为什么会发生此错误或修复此玩具示例。

material/app.dart 中查找如何设置 pageRouteBuilder 之后(如果使用 Android Studio,在任何地方写入 MaterialApp() ,悬停并在出现下划线时按 Ctrl + 单击,然后在打开的文件中搜索 'pageRouteBuilder'),我发现这可以通过

修复
 @override
  Widget build(BuildContext context) {
    final MaterialPageRoute test = MaterialPageRoute<int>(builder: (context) {
      return Container();
    });

    return new WidgetsApp(
        onGenerateRoute: generate,
        pageRouteBuilder: <T>(RouteSettings settings, WidgetBuilder builder) {
          return MaterialPageRoute(builder: builder, settings: settings);
        },
        onUnknownRoute: unKnownRoute,
        textStyle: const TextStyle(),
        initialRoute: "/",
        routes: <String, WidgetBuilder>{
          '/test': (BuildContext context) => Container(
                child: Text('test'),
                color: Colors.green,
              ),
        },
        color: Colors.red);
  }

如果我知道为什么 <T> 将来在这种情况下有意义,我将编辑它并在此处进行尽可能多的解释。