Flutter基础(前端教程③-跳转)

在 Flutter 中,点击卡片列表跳转到详情页,核心是使用 Navigator 组件管理页面跳转。

完整代码(含跳转功能)

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

void main() {
  runApp(const MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(primarySwatch: Colors.green),
      // 配置路由(管理页面跳转)
      initialRoute: '/', // 初始页面
      routes: {
        '/': (context) => const ChatListPage(), // 列表页
        '/detail': (context) => const ChatDetailPage(), // 详情页
      },
    );
  }
}

// 1. 聊天列表页
class ChatListPage extends StatelessWidget {
  const ChatListPage({Key? key}) : super(key: key);

  // 模拟聊天数据
  List<Map<String, dynamic>> getChats() {
    return [
      {
        'id': 1,
        'name': '张三',
        'avatar': 'https://picsum.photos/100/100?random=1',
        'message': '下午一起吃饭吗?',
        'time': DateTime.now().subtract(const Duration(minutes: 5)),
      },
      {
        'id': 2,
        'name': '李四',
        'avatar': 'https://picsum.photos/100/100?random=2',
        'message': '好的,我稍后回复你',
        'time': DateTime.now().subtract(const Duration(hours: 1)),
      },
    ];
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('微信')),
      body: ListView.builder(
        itemCount: getChats().length,
        itemBuilder: (context, index) {
          final chat = getChats()[index];
          return ListTile(
            leading: CircleAvatar(
              backgroundImage: NetworkImage(chat['avatar']),
            ),
            title: Text(chat['name']),
            subtitle: Text(chat['message']),
            trailing: Text(DateFormat('HH:mm').format(chat['time'])),
            // 点击事件:跳转到详情页
            onTap: () {
              // 传递数据到详情页(通过路由参数)
              Navigator.pushNamed(
                context,
                '/detail',
                arguments: chat, // 把当前聊天数据传过去
              );
            },
          );
        },
      ),
    );
  }
}

// 2. 聊天详情页
class ChatDetailPage extends StatelessWidget {
  const ChatDetailPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    // 获取从列表页传递过来的数据
    final Map<String, dynamic> chat =
        ModalRoute.of(context)?.settings.arguments as Map<String, dynamic>;

    return Scaffold(
      appBar: AppBar(
        title: Text(chat['name']), // 显示聊天对象名称
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('与 ${chat['name']} 的聊天详情'),
            const SizedBox(height: 20),
            Text('最后一条消息:${chat['message']}'),
            // 可以在这里添加更多详情内容(如聊天记录)
          ],
        ),
      ),
    );
  }
}
相关推荐
橙序员小站6 分钟前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
火柴就是我2 小时前
让我们实现一个更好看的内部阴影按钮
android·flutter
炫饭第一名3 小时前
速通Canvas指北🦮——基础入门篇
前端·javascript·程序员
王晓枫3 小时前
flutter接入三方库运行报错:Error running pod install
前端·flutter
符方昊3 小时前
React 19 对比 React 16 新特性解析
前端·react.js
ssshooter3 小时前
又被 Safari 差异坑了:textContent 拿到的值居然没换行?
前端
曲折3 小时前
Cesium-气象要素PNG色斑图叠加
前端·cesium
Forever7_3 小时前
Electron 淘汰!新的桌面端框架 更强大、更轻量化
前端·vue.js
Angelial3 小时前
Vue3 嵌套路由 KeepAlive:动态缓存与反向配置方案
前端·vue.js
jiayu4 小时前
Angular学习笔记24:Angular 响应式表单 FormArray 与 FormGroup 相互嵌套
前端