摘要:是借鉴的开发思想实现的,在子组件的插槽上,有,有。当然也有类似的,那就是,不过是以的形式实现像。的使用无非个属性初始路由匹配路由在实现层面首先的高度为。最后执行寻找路由顺序是,这个和的是类似的。
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项目地址: https://github.com/zhongmeizhi/fultter-example-app{ @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://www.ucloud.cn/yun/104591.html
阅读 1775·2023-04-25 14:28
阅读 1865·2021-11-19 09:40
阅读 2763·2021-11-17 09:33
阅读 1350·2021-11-02 14:48
阅读 1629·2019-08-29 16:36
阅读 3239·2019-08-29 16:09
阅读 2885·2019-08-29 14:17
阅读 2346·2019-08-29 14:07