Flutter 组件之基本路由、命名路由定义传参应用

拼搏现实的明天。 2023-07-17 06:08 78阅读 0赞
基本路由

语法:
Navigator.of(context).push(

MaterialPageRoute(builder: (context)=>路由页面类

);

  1. import 'package:flutter/material.dart';
  2. import 'Search.dart';//引入需要跳转的页面
  3. class HomePage extends StatefulWidget {
  4. HomePage({ Key key}) : super(key: key);
  5. @override
  6. _HomePageState createState() => _HomePageState();
  7. }
  8. class _HomePageState extends State<HomePage> {
  9. @override
  10. Widget build(BuildContext context) {
  11. return Column(
  12. crossAxisAlignment: CrossAxisAlignment.start,
  13. mainAxisAlignment: MainAxisAlignment.center,
  14. children: <Widget>[
  15. RaisedButton(onPressed: (){ //点击按钮跳转
  16. Navigator.of(context).push(//路由方法
  17. MaterialPageRoute(builder: (context)=>SearchPage())//这里填写路由页面就可以了
  18. );
  19. },child: Text("基本路由跳转到Search页面"),),
  20. ],
  21. );
  22. }
  23. }
命名路由

下面以模块化定义不同的功能. 。项目中也是这样使用, 命名路由在官方的基础上进行改进封装

一、入口文件 main.dart

  1. import 'package:flutter/material.dart';
  2. import 'routes/Routes.dart';//路由模块导入
  3. void main() {
  4. runApp(LearnFulWidget());
  5. }
  6. class LearnFulWidget extends StatelessWidget {
  7. @override
  8. Widget build(BuildContext context) {
  9. return Container(
  10. child: MaterialApp(
  11. // home: HomePageSet(),
  12. initialRoute: "/",//初始路由属性 在路由配置文件定义为斜杠
  13. //命名路由传参
  14. // ignore: missing_return
  15. onGenerateRoute:onGenerateRoute,//命名路由属性
  16. ),
  17. );
  18. }
  19. }

二、路由模块 Routes.dart

  1. import 'package:flutter/material.dart';
  2. //导入所有的路由页面
  3. import '../pages/Search.dart';
  4. import '../pages/Form.dart';
  5. import '../pages/MyNewPage.dart';
  6. import '../pages/Tabs.dart';
  7. //配置路由
  8. final routes = {
  9. //初始化路由页面不一定是斜杠 取决于在入口文件怎么定的的
  10. "/": (context,) => HomePageSet(),
  11. //可选参数定义 一 二 三
  12. "/Search": (context, { arguments}) => SearchPage(arguments: arguments),
  13. //不需要传参的默认定义方式
  14. '/Form': (context,) => FormPage(),
  15. "/NewPage": (context, { arguments}) => NewPage(arguments: arguments),
  16. };
  17. //可以把下面当做固定写法,官方命名路由的改进
  18. // ignore: missing_return, top_level_function_literal_block
  19. var onGenerateRoute = (RouteSettings settings) {
  20. final String name = settings.name;
  21. final Function pageContentBuilder = routes[name];
  22. if (pageContentBuilder != null) {
  23. if (settings.arguments != null) {
  24. final Route route = MaterialPageRoute(
  25. builder: (context) =>
  26. pageContentBuilder(context, arguments: settings.arguments));
  27. return route;
  28. } else {
  29. final Route route =
  30. MaterialPageRoute(builder: (context) => pageContentBuilder(context));
  31. return route;
  32. }
  33. }
  34. };

三、页面传参 HomePage.dart

语法:
Navigator.pushNamed(

context, "页面/NewPage",arguments: {"param":"参数值"}

);

  1. import 'package:flutter/material.dart';
  2. import 'Search.dart';//页面导入
  3. import 'MyNewPage.dart';//页面导入
  4. class HomePage extends StatefulWidget {
  5. HomePage({ Key key}) : super(key: key);
  6. @override
  7. _HomePageState createState() => _HomePageState();
  8. }
  9. class _HomePageState extends State<HomePage> {
  10. @override
  11. Widget build(BuildContext context) {
  12. return Column(
  13. crossAxisAlignment: CrossAxisAlignment.start,
  14. mainAxisAlignment: MainAxisAlignment.center,
  15. children: <Widget>[
  16. RaisedButton(onPressed: (){
  17. // 命名路由传参 传参格式
  18. Navigator.pushNamed(context, "/NewPage",arguments: { "param":"我是NewPage无状态组件参数"});
  19. },child: Text("带参数跳转到NewPage页面无状态组件中"),),
  20. RaisedButton(onPressed: (){
  21. Navigator.pushNamed(context, "/Search",arguments: { "ids":"我是有状态组件参数"});
  22. },child: Text("带参数跳转到Search有状态组件中"),),
  23. SizedBox(height: 20,),
  24. RaisedButton(onPressed: (){
  25. },child: Text("跳转到表单"),)
  26. ],
  27. );
  28. }
  29. }

四、接收参数

Search.dart 有状态组件

  1. import 'package:flutter/material.dart';
  2. class SearchPage extends StatefulWidget {
  3. final Map arguments;//定义参数映射对象 final 常量
  4. //可选参数定义
  5. SearchPage({ Key key, String list, this.arguments}) : super(key: key);
  6. @override
  7. //这里多一步要通过数据状态方法传递给组件
  8. _SearchPageState createState() => _SearchPageState(arguments:this.arguments);
  9. }
  10. class _SearchPageState extends State<SearchPage> {
  11. Map arguments; //组件内定义接收值
  12. _SearchPageState({ this.arguments});//构造函数接收可选参数
  13. @override
  14. Widget build(BuildContext context) {
  15. print(arguments);
  16. return Container(
  17. child: Scaffold(
  18. floatingActionButton: FloatingActionButton(
  19. child: Text("返回"),
  20. onPressed: () {
  21. Navigator.of(context).pop();
  22. },
  23. ),
  24. appBar: AppBar(
  25. title: Text("我是内容search标题"),
  26. ),
  27. body: Container(
  28. child: Column(
  29. children: <Widget>[
  30. Center(
  31. child: Text(//直接调用打印
  32. "我是argumentsid:${arguments != null ? arguments['id'] :"没有id"},我是ids:${arguments != null ? arguments['ids'] : "arguments为空"}")),
  33. RaisedButton(
  34. onPressed: () {
  35. Navigator.pushNamed(context, "/Form");
  36. },
  37. child: Text("跳转到Form"),
  38. )
  39. ],
  40. )),
  41. ),
  42. );
  43. }
  44. }

MyNewPage.dart 无状态组件
这个相对简单一些

  1. import 'package:flutter/material.dart';
  2. // ignore: must_be_immutable
  3. class NewPage extends StatelessWidget {
  4. final arguments;//定义常量
  5. NewPage({ this.arguments});//构造函数接收可选参数
  6. @override
  7. Widget build(BuildContext context) {
  8. return Container(
  9. child: Scaffold(
  10. floatingActionButton: FloatingActionButton(
  11. child: Text("返回"),
  12. onPressed: () {
  13. Navigator.of(context).pop();
  14. },
  15. ),
  16. appBar: AppBar(
  17. title: Text("我是内容search标题"),
  18. ),
  19. body: Container(
  20. child: Column(
  21. children: <Widget>[
  22. Center(
  23. child: Text(//调用参数
  24. "我是arguments:::${arguments != null ? arguments['param'] : 11111}")),
  25. RaisedButton(
  26. onPressed: () {
  27. Navigator.pushNamed(context, "/Form");
  28. },
  29. child: Text("跳转到Form"),
  30. )
  31. ],
  32. )),
  33. ),
  34. );
  35. }
  36. }

发表评论

表情:
评论列表 (有 0 条评论,78人围观)

还没有评论,来说两句吧...

相关阅读

    相关 vue-03--

    和平时的页面跳转一样,我们可能需要在地址栏上传递某些参数,例如,从商品列表页面,跳转的某个商品的详情页面,这个时候,如果是页面跳转的时候,我们会直接在url上跟上一个商品id,

    相关 Vue跳转+

    之前在原生JS的开发中,我们经常会用到根据某一状态进行页面的跳转。 比如:登录成功跳到首页,点击商品列表的某个商品跳转商品详情等。 而常见的写法就是: locat