当前位置: 首页 > news >正文

Flutter基础(前端教程①⑤-API请求转化为模型列成列表展示实战)

  1. models/post_model.dart

    • 定义 Post 数据模型
    • 包含 fromJson() 方法用于解析 JSON
  2. controllers/post_controller.dart

    • 管理帖子数据的获取和状态
    • 使用 http 包请求 API
    • 通过 RxList 和 RxBool 实现响应式状态管理
  3. views/post_list_view.dart

    • 展示帖子列表的 UI
    • 使用 Obx 监听状态变化
    • 包含加载中、错误和数据展示三种状态
  4. main.dart

    • 应用入口点
    • 使用 GetMaterialApp 作为根组件
    • 设置主题并指定首页

post_controller.dart

// lib/controllers/post_controller.dart
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import '../models/post_model.dart';class PostController extends GetxController {// 响应式状态final RxList<Post> posts = <Post>[].obs;final RxBool isLoading = false.obs;final RxString? error = RxString?('');// 获取帖子列表Future<void> fetchPosts() async {isLoading.value = true;error.value = null;try {final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts'),);if (response.statusCode == 200) {final List<dynamic> jsonData = json.decode(response.body);// 解析JSON并更新状态posts.assignAll(jsonData.map((item) => Post.fromJson(item)).toList());} else {error.value = '请求失败: ${response.statusCode}';}} catch (e) {error.value = '发生错误: $e';} finally {isLoading.value = false;}}// 初始化@overridevoid onInit() {super.onInit();fetchPosts(); // 控制器初始化时加载数据}
}    

post_model.dart

// lib/models/post_model.dart
class Post {final int id;final int userId;final String title;final String body;Post({required this.id,required this.userId,required this.title,required this.body,});// 从JSON解析factory Post.fromJson(Map<String, dynamic> json) {return Post(id: json['id'] as int,userId: json['userId'] as int,title: json['title'] as String,body: json['body'] as String,);}
}    

post_list_view.dart

// lib/views/post_list_view.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../controllers/post_controller.dart';class PostListView extends StatelessWidget {const PostListView({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {// 获取控制器实例final PostController controller = Get.put(PostController());return Scaffold(appBar: AppBar(title: const Text('Posts'),centerTitle: true,),body: Obx(() {// 加载状态if (controller.isLoading.value) {return const Center(child: CircularProgressIndicator());}// 错误状态if (controller.error.value != null) {return Center(child: Text(controller.error.value!));}// 数据为空if (controller.posts.isEmpty) {return const Center(child: Text('没有数据'));}// 数据列表return ListView.builder(itemCount: controller.posts.length,itemBuilder: (context, index) {final post = controller.posts[index];return Card(margin: const EdgeInsets.all(8.0),elevation: 2,child: ListTile(leading: CircleAvatar(child: Text(post.id.toString())),title: Text(post.title,style: const TextStyle(fontWeight: FontWeight.bold),),subtitle: Text(post.body),onTap: () {// 点击显示详情Get.snackbar('Post #${post.id}','用户ID: ${post.userId}\n标题: ${post.title}',snackPosition: SnackPosition.BOTTOM,);},),);},);}),);}
}    

main.dart

// lib/main.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'views/post_list_view.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return GetMaterialApp(title: 'Flutter GetX Demo',theme: ThemeData(primarySwatch: Colors.blue,),home: const PostListView(),);}
}    

http://www.dtcms.com/a/287490.html

相关文章:

  • 前端面试专栏-工程化:28.团队协作与版本控制(Git)
  • 运用KANO模型分析扫地机器人用户需求
  • LangGraph教程9:LangGraph检查点和Send机制
  • Linux 基础命令:文件和目录操作、文件内容查看、进程管理
  • 【嵌入式电机控制#16】电流环(三):过采样提高采集精度看门狗监测总线电压
  • Nginx 实战 :使用logrotate实现日志轮转与保留策略!
  • 【数据结构】二叉树初阶详解(一):树与二叉树基础 + 堆结构全解析
  • 2025 Data Whale x PyTorch 安装学习笔记(Windows 版)
  • Kotlin方差
  • 403 Forbidden:无权限访问请求的资源如何处理
  • Apache Kafka 学习笔记
  • FreeRTOS—列表和列表项
  • Kafka、RabbitMQ 与 RocketMQ 高可靠消息保障方案对比分析
  • 阿里云服务器 CentOS 7 安装 MySQL 8.4 超详细指南
  • UniApp 优化实践:使用常量统一管理本地存储 Key,提升可维护性
  • 【无标题】重点阅读——如何在信息层面区分和表征卷曲维度,解析黑洞内部的维度区分机制
  • 基于 Google Earth Engine 的 DEM 鞍部自动提取
  • 基于Python的毕业设计选题管理系统设计与实现
  • 【CAN通信】AUTOSAR架构下TC3xx芯片是如何将一帧CAN报文发送出去的
  • NX二次开发常用函数坐标转化UF_MTX4_csys_to_csys和UF_MTX4_vec3_multipl
  • Linux基础命令(第二期)
  • 地图定位与导航
  • Go-Redis × RediSearch 全流程实践
  • Node.js:Stream、模块系统
  • KANO模型分类,以扫地机功能为例子
  • 实验-华为综合
  • 论文略读: RASA: RANK-SHARING LOW-RANK ADAPTATION
  • 《Linux系统配置实战:NTP时间同步与SSH免密登录全流程指南》​​
  • 【洛谷】询问学号、寄包柜、移动零、颜色分类(vector相关算法题p1)
  • LVS(Linux virual server)基础概念详解