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

相关推荐
害人终害己10 小时前
‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
前端·javascript·vue.js
传奇开心果编程10 小时前
【声明式UI开发实用技术学与练】第8课 状态提升与下放
学习·flutter·react native·ui·swiftui·composer
被摘下的星星10 小时前
CSS 基础说明
前端·css
谢亮_vipxieliang11 小时前
Go select 多路复用:从语法到实战的完整指南
开发语言·后端·golang
m0_7381858212 小时前
Flutter 鸿蒙化实战:open_app_settings 适配 OpenHarmony,一键跳转系统设置
flutter·华为·harmonyos·鸿蒙
m0_7381858212 小时前
Flutter 鸿蒙化实战:qr_code_scanner 适配 OpenHarmony,相机扫码实时识别
数码相机·flutter·华为·harmonyos·鸿蒙
To_OC20 小时前
从一头雾水到跑通全流程:我用一个周末啃透了JWT登录鉴权
前端·后端·http
2601_9628857220 小时前
如何用 Python 自动识别股票的支撑位与压力位?
开发语言·python
爱吃奥利奥_wen21 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
我可能是个假开发21 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring