Flutter基础(前端教程⑧-数据模型)

这个示例展示了如何创建数据模型、解析 JSON 数据,以及在 UI 中使用这些数据:

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

void main() {
  // 示例:手动创建User对象
  final user = User(
    id: 1,
    name: '张三',
    age: 25,
    email: 'zhangsan@example.com',
    isPremium: true,
  );

  // 示例:将User对象转为JSON
  final jsonData = user.toJson();
  print('转为JSON: $jsonData');

  // 示例:从JSON解析User对象
  final jsonString = '{"id":2,"name":"李四","age":30,"email":"lisi@example.com","isPremium":false}';
  final parsedUser = User.fromJson(json.decode(jsonString));
  print('解析后的用户: ${parsedUser.name}');

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('数据模型示例')),
        body: const Center(
          child: Text('查看控制台输出了解数据模型用法'),
        ),
      ),
    );
  }
}

// 数据模型
class User {
  final int id;
  final String name;
  final int age;
  final String email;
  final bool isPremium;

  // 构造函数
  User({
    required this.id,
    required this.name,
    required this.age,
    required this.email,
    required this.isPremium,
  });

  // 从JSON解析为User对象
  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      id: json['id'] ?? 0, // 提供默认值,防止null
      name: json['name'] ?? '',
      age: json['age'] ?? 0,
      email: json['email'] ?? '',
      isPremium: json['isPremium'] ?? false,
    );
  }

  // 将User对象转为JSON
  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'name': name,
      'age': age,
      'email': email,
      'isPremium': isPremium,
    };
  }

  // 重写toString方法,方便打印对象信息
  @override
  String toString() {
    return 'User{id: $id, name: $name, age: $age, email: $email, isPremium: $isPremium}';
  }
}

多条数据

1. 数据模型

Dart 复制代码
class User {
  final int id;
  final String name;
  final int age;

  User({
    required this.id,
    required this.name,
    required this.age,
  });

  // 从JSON解析单个用户
  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      id: json['id'] ?? 0,
      name: json['name'] ?? '',
      age: json['age'] ?? 0,
    );
  }

  // 解析用户列表
  static List<User> fromJsonList(List<dynamic> jsonList) {
    return jsonList.map((json) => User.fromJson(json)).toList();
  }
}

2. 模拟 JSON 数据与解析示例

Dart 复制代码
// 模拟API返回的用户列表JSON
String mockUserListJson = '''
[
  {"id": 1, "name": "张三", "age": 25},
  {"id": 2, "name": "李四", "age": 30},
  {"id": 3, "name": "王五", "age": 22}
]
''';

// 解析示例
void parseUsers() {
  final List<dynamic> jsonList = json.decode(mockUserListJson);
  final List<User> users = User.fromJsonList(jsonList);
  
  print('用户数量: ${users.length}');
  print('第一个用户: ${users[0].name}');
}

3. UI 展示(列表组件)

Dart 复制代码
class UserListPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 解析模拟数据
    final List<dynamic> jsonList = json.decode(mockUserListJson);
    final List<User> users = User.fromJsonList(jsonList);

    return Scaffold(
      appBar: AppBar(title: const Text('用户列表')),
      body: ListView.builder(
        itemCount: users.length,
        itemBuilder: (context, index) {
          final user = users[index];
          return ListTile(
            leading: CircleAvatar(child: Text('${user.id}')),
            title: Text(user.name),
            subtitle: Text('年龄: ${user.age}'),
            trailing: const Icon(Icons.arrow_forward_ios),
            onTap: () {
              // 点击事件处理
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(content: Text('点击了 ${user.name}')),
              );
            },
          );
        },
      ),
    );
  }
}
相关推荐
一只大侠的侠4 小时前
Flutter开源鸿蒙跨平台训练营 Day 10特惠推荐数据的获取与渲染
flutter·开源·harmonyos
崔庆才丨静觅6 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60617 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了7 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅7 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅7 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
renke33648 小时前
Flutter for OpenHarmony:色彩捕手——基于HSL色轮与感知色差的交互式色觉训练系统
flutter
崔庆才丨静觅8 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment8 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅8 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端