欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Flutter 局部路由实现详解

程序员文章站 2023-01-07 14:14:47
flutter是借鉴react的开发思想实现的,在子组件的插槽上,react有this.props.children,vue有

flutter是借鉴react的开发思想实现的,在子组件的插槽上,react有this.props.children,vue有<slot></slot>。

当然flutter也有类似的widget,那就是navigator,不过是以router的形式实现(像<router-view></router-view>???)。

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<navigatorpage> {
 @override
 widget build(buildcontext context) {
  return scaffold(
   appbar: appbar(
    title: text('navigator'),
   ),
   body: column(
    children: <widget>[
     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<double> animation, animation<double> secondaryanimation) => column(
           // 并没有在 materialapp 中设定 /efg 路由
           // 因为navigator的特性 使用ncontext 可以跳转 /efg
           children: <widget>[
            text('呵呵呵'),
            raisedbutton(
             child: text('去 /efg'),
             onpressed: () {
              navigator.pushnamed(ncontext, '/efg');
             },
            )
           ],
          );
         break;
         case '/efg':
          builder = (buildcontext ncontext, animation<double> animation, animation<double> secondaryanimation) => row(
           children: <widget>[
            raisedbutton(
             child: text('去 /hhh'),
             onpressed: () {
              navigator.pushnamed(ncontext, '/hhh');
             },
            )
           ],
          );
         break;
         default:
          builder = (buildcontext ncontext, animation<double> animation, animation<double> 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: <navigatorobserver>[]
      ),
     ),
     text('navigator执行寻找路由顺序'),
     text('initialroute'),
     text('ongenerateroute'),
     text('onunknownroute'),
    ],
   ),
  );
 }
}

项目地址:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。