Flutter第十六节-----路由管理(2)

一.命名路由传递参数

●作用:通过路由传递参数是实现页面间数据通信的常用方式

●传递参数(命名路由):Navigator.pushNamed(context,地址,arguments:{参数)

●接收参数(命名路由):ModalRoute.of(context)?.settings.arguments

●接收时机:initState获取不到路由参数,放置在Future.microtask(异步微任务)中

Dart 复制代码
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

void main(List<String> args) {
  runApp(MainPage());
}

class MainPage extends StatelessWidget {
  const MainPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ListPage(),
      initialRoute: "/list",
      routes: {
        "/list": (context) => ListPage(),
        "/detail": (context) => DetailPage(),
      },
    );
  }
}

class ListPage extends StatefulWidget {
  ListPage({Key? key}) : super(key: key);

  @override
  _ListPageState createState() => _ListPageState();
}

class _ListPageState extends State<ListPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("列表页")),
      body: ListView.builder(
        itemCount: 100,
        padding: EdgeInsets.all(10),
        itemBuilder: (BuildContext context, int index) {
          return GestureDetector(
            //用于识别用户的按下
            onTap: () {
              Navigator.pushNamed(
                context,
                "/detail",
                arguments: {"id": index + 1},
              );
              // Navigator.push(
              //   context,
              //   MaterialPageRoute(builder: (context) => DetailPage()),
              // );
            },
            child: Container(
              height: 100,
              margin: EdgeInsets.only(top: 10),
              color: Colors.blue,
              alignment: Alignment.center,
              child: Text(
                '列表项${index + 1}',
                style: TextStyle(color: Colors.white, fontSize: 16),
              ),
            ),
          );
        },
      ),
    );
  }
}

class DetailPage extends StatefulWidget {
  DetailPage({Key? key}) : super(key: key);

  @override
  _DetailPageState createState() => _DetailPageState();
}

class _DetailPageState extends State<DetailPage> {
  @override
  String _id = "";
  void initState() {
    // TODO: implement initState
    super.initState();
    Future.microtask(() {
      if (ModalRoute.of(context) != Null) {
        Map<String, dynamic> params =
            ModalRoute.of(context)!.settings.arguments as Map<String, dynamic>;
        print(params["id"]);
        _id = params["id"].toString();
        setState(() {});
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("详情页")),
      body: Center(
        child: Column(
          children: [
            TextButton(
              onPressed: () {
                Navigator.pop(context);
              },
              child: Text("列表页$_id"),
            ),
            TextButton(
              onPressed: () {
                Navigator.pop(context);
              },
              child: Text("返回上一个页面"),
            ),
          ],
        ),
      ),
    );
  }
}

二.基础路由传递参数

●传递参数(基础路由):通过组件构造函数传递参数-(父传子)

●接收参数(基础路由):通过组件构造函数接收参数-(父传子)

●接收时机:initState可获取到基础路由的构造函数传参

相关推荐
事圆则缓1 分钟前
Android 版本号、API Level 和 JDK 版本有什么关系?
android
超级架构师4 分钟前
让 COBOL 长出 AI 大脑:原生 Agent 核心框架 praxo-core 深度剖析
c语言·开发语言·c++·人工智能·python·架构·ai编程
努力变的更好8 分钟前
H5与小程序之间的回调
前端·小程序·apache
Non-existent9879 分钟前
在 WPS/Excel 里做地理数据处理:功能市场 + 奥维 / Google Earth / QGIS 三种跳转实战
开发语言·javascript·ecmascript
zhougl99615 分钟前
什么是 URL
javascript
汤米粥16 分钟前
目前流行的前端 CSS 框架
前端·css·bootstrap·ant design·‌tailwind css·bulma
砚凝霜16 分钟前
CTF Misc 签到 GXUST·CTF:查看源码 + HTML 注释 + Base64 解码(附 Base64 原理)
前端·html
zhangguojia719 分钟前
Android Activity 生命周期结束流程:从 finish() 到 onDestroy() 的跨进程状态调度
android
xiaolang_8616_wjl28 分钟前
c++游戏_宝可梦大世界(源代码)
开发语言·c++·游戏
徐小夕33 分钟前
扒了JitWord的源码,我终于搞懂了企业级在线Word到底有多难写
前端·vue.js·github