flutter路由

flutter路由管理
使用路由根widget必须是MaterialApp,MaterialApp内部会自动创建一个Navigator和管理Navigator
的上下文。Navigator最常用的两个方法是push和pop,push是添加一个新页面,pop是退出这个页面。
push:
//push();参数是一个抽象类,需要使用子类MaterialPageRoute,
//可通过路由传递值,返回值是pop时传递的值

var result = await navigator.push(MaterialPageRoute(builder: (BuildContext context) => MyPage()));
  print(result);//success

pop:
//pop([Tresult]) 可以传参数给上一个页面;这里传一个字符串””success““

navigator.pop(”success“);

//还有其他方法,都是大同小异。
//下面介绍路由管理
这种路由管理方式是我做了几个项目之后总结的,个人认为这种管理方式就很好了,简单实用,一眼就能看懂;
实用起来非常方便。

MaterialApp类有三个属性,
navigatorKey:导航上下文;
onGenerateRoute:接收一个函数,我们需要再这个函数内部实现路由的调转功能,根据字符串参数去匹配
要跳转哪一个页面;并返回这个页面;
initialRoute:设置一个默认的主页面

MaterialPageRoute类介绍:
MaterialPageRoute({
WidgetBuilder builder,
RouteSettings settings,
bool maintainState = true,
bool fullscreenDialog = false,
})
builder: 是一个WidgetBuilder类型的回调函数,它的作用是构建路由页面的具体内容,返回值是一个widget。通常实现此回调,返回新路由的实例。
settings 包含路由的配置信息,如路由名称、是否初始路由(首页)。
maintainState:默认情况下,当入栈一个新路由时,原来的路由仍然会被保存在内存中,如果想在路由没用的时候释放其所占用的所有资源,可以设置maintainState为false。
fullscreenDialog表示新的路由页面是否是一个全屏的模态对话框,在iOS中,如果fullscreenDialog为true,新页面将会从屏幕底部滑入(而不是水平方向)。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
                navigatorKey: RouterManager().navigatorKey,
                onGenerateRoute: RouterManager.onGenerateRoute,
                initialRoute: RouteName.main,
          );
  }
}

//给每一个页面定义一个名字,跳转页面时直接输入名字即可

class RouterName {
  static const String user = 'user';//个人页面
  static const String main = '/';//默认根页面
}
class RouterManager {
//定义一个单例
  factory RouterManager() => _getInstance();
  static RouterManager _instance;
  RouterManager._internal();
  static RouterManager _getInstance() {
    if (_instance == null) {
      _instance = RouterManager._internal();
    }
    return _instance;
  }
//定义一个全局的NavigatorState上下文,
  final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
  NavigatorState get navigator => navigatorKey.currentState;
  //以后跳转页面就用下面的方法
  get pushNamed => navigator.pushNamed;
  get push => navigator.push;
  get pop => navigator.pop;
  get popAndPushNamed => navigator.popAndPushNamed;

//定义一个方法,按照MaterialApp的onGenerateRoute属性定义,
//当调用pushNamed跳转页面时,会根据传入的name参数到RouteSettings,
然后再方法里面匹配字符串去跳转相应的页面。
  static Route<dynamic> onGenerateRoute(RouteSettings settings) {
    switch (settings.name) {
      case RouterName.user:
        return MaterialPageRoute(builder: (context) => User());
        break;
      case RouterName.main:
        return MaterialPageRoute(builder: (context) => Home());
        break;
      default:
        return MaterialPageRoute(
          builder: (_) => Scaffold(
            body: Center(
              child: Text('No route defined for ${settings.name}'),
            ),
          ),
        );
    }
  }
}

跳转页面时使用

RouterManager().pushNamed(RouterName.user);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值