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可获取到基础路由的构造函数传参

相关推荐
我命由我123455 小时前
CesiumJS 笔记 - 获取容器中心点、Cartesian3 clone 方法、修改 Cartesian3 对象的高度
前端·javascript·css·前端框架·html·html5·js
Hopebearer_6 小时前
页面突然只剩 DOM?一次静态资源版本错配排查
前端·部署
抱抱宝6 小时前
Agent-study项目教程(03):手写 Mini-ReAct Agent(不依赖框架)
javascript·人工智能·gpt·react.js·prompt·agent
东风破_6 小时前
ESLint 是什么?为什么你的项目需要它?
前端·后端·代码规范
用户938515635077 小时前
Next.js 笔记系统(二):Redis 数据服务与侧边栏组件拆分实战
javascript·全栈
WWJA王文举7 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
zhanghaha13147 小时前
Python进阶教程:6_JSON 数据解析 —— 新手完全指南
开发语言·python·json
圣殿骑士-Khtangc8 小时前
Go字符串高效拼接性能对比与底层原理分析
服务器·前端·golang
qq_448011168 小时前
C语言中的动态内存分配
c语言·开发语言·php
BigTopOne9 小时前
【ijkplayer】 硬解码流程
前端