flutter路由配置

路由配置文件

import 'package:flutter/material.dart';
import 'package:ichat/routers/pages/form_page.dart';
import 'package:ichat/routers/pages/person_page.dart';
import 'package:ichat/routers/pages/search_page.dart';
import 'package:ichat/routers/router_page.dart';
class RouteConfig {
 static String initRoute="/";
  static Map<String, WidgetBuilder> routes = {
    initRoute: (context) => const StaticRouterPage(),
    '/person': (context) => const PersonPage(),
    '/search': (context) => const SearchPage(),
    "/form": (context,{arguments}) => FormPage(arguments:arguments),
  };
  static var onGenerateRoute = (RouteSettings settings) {
    // print("$settings  ,name: ${settings.name} ,arguments: ${settings.arguments}");
//生成路由
    String? name = settings.name;
    var arguments = settings.arguments;
    Function? func = routes[name];
    if (func != null) {
      if (arguments == null) {
        return MaterialPageRoute(builder: (context) => func!(context));
      } else {
        return MaterialPageRoute(builder: (context) => func!(context, arguments));
      }
    }
    return null;
  };
}

程序启动主函数文件


import 'package:flutter/material.dart';
import 'package:ichat/routers/route_config.dart';


main(){


  runApp(
      MaterialApp(
        title: "dynamic router",
        debugShowCheckedModeBanner: false,
        theme: ThemeData(primarySwatch: Colors.blue),
        // home: const StaticRouterPage(), //home和 initialRoute不能同时存在,否则会报错
        initialRoute: RouteConfig.initRoute,
        routes: RouteConfig.routes,
        onGenerateRoute: RouteConfig.onGenerateRoute,
      )
  );


}

路由使用

import 'package:flutter/material.dart';
import 'package:ichat/routers/pages/news_page.dart';
import 'package:ichat/routers/pages/person_page.dart';
import 'package:ichat/routers/pages/search_page.dart';

class StaticRouterPage extends StatefulWidget {
  const StaticRouterPage({super.key});

  @override
  State<StaticRouterPage> createState() => _StaticRouterPageState();
}

class _StaticRouterPageState extends State<StaticRouterPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: Text("路由"),),
        body: Container(
            child: Center(
                child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          crossAxisAlignment: CrossAxisAlignment.center,
                          children: [
                            ElevatedButton(
                                onPressed: () {
                                  Navigator.of(context).push(MaterialPageRoute(
                                    builder: (context) => const SearchPage(),
                                  ));
                                },
                                child: Text("搜索")),
                            SizedBox(width: 20,),
                            ElevatedButton(
                                onPressed: () {
                                  Navigator.of(context).push(MaterialPageRoute(
                                    builder: (context) => const PersonPage(),
                                  ));
                                },
                                child: Text("我的")),
                            SizedBox(width: 20,),
                            ElevatedButton(
                                onPressed: () {
                                  Navigator.of(context).push(MaterialPageRoute(
                                    builder: (context) => const NewsPage(title: "国际小新闻",newsId: 20),
                                  ));
                                },
                                child: Text("新闻")),
                          ]),
                        SizedBox(height: 20,),
                      Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          crossAxisAlignment: CrossAxisAlignment.center,
                          children: [
                            ElevatedButton(
                                onPressed: () {
                                  Navigator.of(context).pushNamed("/search");
                                },
                                child: Text("搜索")),
                            SizedBox(width: 20,),
                            ElevatedButton(
                                onPressed: () {
                                  Navigator.of(context).pushNamed("/form",arguments: {
                                    "key1":"value1",
                                    "key2":"value2",
                                  });
                                },
                                child: Text("form")),
                            SizedBox(width: 20,),
                            ElevatedButton(
                                onPressed: () {
                                  Navigator.pushNamed(context,"/person");
                                },
                                child: Text("我的")),
                            // SizedBox(width: 20,),
                            // ElevatedButton(
                            //     onPressed: () {
                            //       Navigator.of(context).push(MaterialPageRoute(
                            //         builder: (context) => const NewsPage(title: "国际小新闻",newsId: 20),
                            //       ));
                            //     },
                            //     child: Text("新闻")),
                          ]),
                    ]
                )

                )
            )

    );
  }
}

路由使用的几种方式

1、push不带参数

Navigator.of(context).push(MaterialPageRoute(
                                    builder: (context) => const PersonPage(),
                                  ));

2、push带参数

Navigator.of(context)
         .push(MaterialPageRoute(builder: (context) => const NewsPage(title: "国际小新闻",newsId: 20),
                                  ));

3、通过命名路由配置pushNamed

Navigator.of(context).pushNamed("/search");

4、 通过命名路由配置带参数pushNamed

Navigator.of(context).pushNamed("/form",arguments: {
  "key1":"value1",
  "key2":"value2",
});

5、路由返回

Navigator.of(context).pop()

6、pushReplacementNamed

Navigator.of(context).pushReplacementNamed("/search");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值