资讯专栏INFORMATION COLUMN

Flutter 局部路由实现

golden_hamster / 1651人阅读

摘要:是借鉴的开发思想实现的,在子组件的插槽上,有,有。当然也有类似的,那就是,不过是以的形式实现像。的使用无非个属性初始路由匹配路由在实现层面首先的高度为。最后执行寻找路由顺序是,这个和的是类似的。

Flutter是借鉴React的开发思想实现的,在子组件的插槽上,React有this.props.children,Vue有

当然Flutter也有类似的Widget,那就是Navigator,不过是以router的形式实现(像???)。

Navigator的使用无非3个属性

initialRoute: 初始路由

onGenerateRoute: 匹配路由

onUnknownRoute: 404

在实现层面

首先:Navigator的高度为infinity。如果直接父级非最上级也是infinity会产生异常,例如,Scaffold -> Column -> Navigator。所以:Navigator需要附件限制高度,例如:Scaffold -> Column -> Container(height: 300) -> Navigator

然后:在onGenerateRoute属性中,使用第一个BuildContext参数,能够在MaterialApp未设置route的情况下使用Navigator.pushNamed(nContext, "/efg");跳到对应的子路由中。

最后:Navigator执行寻找路由顺序是 initialRoute -> onGenerateRoute -> onUnknownRoute,这个和React的Route是类似的。

最后附上源码

import "package:flutter/material.dart";

class NavigatorPage extends StatefulWidget {
  @override
  _NavigatorPageState createState() => _NavigatorPageState();
}

class _NavigatorPageState extends State {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Navigator"),
      ),
      body: Column(
        children: [
          Text("Navigator的高度为infinity"),
          Text("如果直接父级非最上级也是infinity会产生异常"),
          Container(
            height: 333,
            color: Colors.amber.withAlpha(111),
            child: Navigator( // Navigator
              initialRoute: "/abc",
              onGenerateRoute: (val) {
                RoutePageBuilder builder;
                switch (val.name) {
                  case "/abc":
                    builder = (BuildContext nContext, Animation animation, Animation secondaryAnimation) => Column(
                      // 并没有在 MaterialApp 中设定 /efg 路由
                      // 因为Navigator的特性 使用nContext 可以跳转 /efg
                      children: [
                        Text("呵呵呵"),
                        RaisedButton(
                          child: Text("去 /efg"),
                          onPressed: () {
                            Navigator.pushNamed(nContext, "/efg");
                          },
                        )
                      ],
                    );
                  break;
                  case "/efg":
                    builder = (BuildContext nContext, Animation animation, Animation secondaryAnimation) => Row(
                      children: [
                        RaisedButton(
                          child: Text("去 /hhh"),
                          onPressed: () {
                            Navigator.pushNamed(nContext, "/hhh");
                          },
                        )
                      ],
                    );
                  break;
                  default:
                    builder = (BuildContext nContext, Animation animation, Animation secondaryAnimation) => Center(
                      child: RaisedButton(
                        child: Text("去 /abc"),
                        onPressed: () {
                          Navigator.pushNamed(nContext, "/abc");
                        },
                      )
                    );
                }
                return PageRouteBuilder(
                  pageBuilder: builder,
                  // transitionDuration: const Duration(milliseconds: 0),
                );
              },
              onUnknownRoute: (val) {
                print(val);
              },
              observers: []
            ),
          ),
          Text("Navigator执行寻找路由顺序"),
          Text("initialRoute"),
          Text("onGenerateRoute"),
          Text("onUnknownRoute"),
        ],
      ),
    );
  }
}
项目地址: https://github.com/zhongmeizhi/fultter-example-app

撸完代码记得给颗星哦。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104591.html

相关文章

  • 跨平台技术演进

    摘要:接下来,我将从原理优缺点等方面为大家分享跨平台技术演进。小程序年是微信小程序飞速发展的一年,年,各大厂商快速跟进,已经有了很大的影响力。下面,我们以微信小程序为例,分析小程序的技术架构。 前言 大家好,我是simbawu ,@BooheeFE Team Leader,关于这篇文章,有问题欢迎来这里讨论。 随着移动互联网的普及和快速发展,手机成了互联网行业最大的流量分发入口。以及随着5G...

    魏宪会 评论0 收藏0
  • 跨平台技术演进

    摘要:接下来,我将从原理优缺点等方面为大家分享跨平台技术演进。小程序年是微信小程序飞速发展的一年,年,各大厂商快速跟进,已经有了很大的影响力。下面,我们以微信小程序为例,分析小程序的技术架构。 前言 大家好,我是simbawu ,@BooheeFE Team Leader,关于这篇文章,有问题欢迎来这里讨论。 随着移动互联网的普及和快速发展,手机成了互联网行业最大的流量分发入口。以及随着5G...

    MasonEast 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<