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

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.xdnf.cn/news/15760.html

相关文章:

  • 财务数字化——解读财务指标及财务分析的基本步骤与方法【附全文阅读】
  • Error:HTTP Status 405 - HTTP method POST is not supported by this URL
  • 大数据之路:阿里巴巴大数据实践——日志采集与数据同步
  • 短视频矩阵的未来前景:机遇无限,挑战并存
  • [spring6: Advice Advisor Advised]-快速理解
  • stm32继电器使用方法
  • 【HarmonyOS】Ability Kit - Stage模型
  • 2023 年 5 月青少年软编等考 C 语言八级真题解析
  • 安装tomcat启动startup.bat出现闪退问题
  • 驾驭 Spring Boot 事件机制:8 个内置事件 + 自定义扩展实战
  • windows wsl ubuntu 如何安装 maven
  • 前端知识回顾-登录界面
  • 实现el-select下拉框,下拉时加载数据
  • 【RK3576】【Android14】摄像头MIPI开发调试
  • [Python] -实用技巧10- 时间处理:datetime 和 time 模块入门
  • 【数据结构初阶】--双向链表(二)
  • 跨境卖家紧急自查,Endryko Karmadi四季版画版权维权
  • 【嵌入式电机控制#16】电流环(三):过采样提高采集精度看门狗监测总线电压
  • 【Linux系统】进程控制
  • 从0开始学习R语言--Day51--PH检验
  • OpenCV 官翻 1 -介绍、安装、功能概览、核心操作
  • 云计算与 DevOps(开发与运维)
  • sqli-labs靶场通关笔记:第32-33关 宽字节注入
  • Java 中的继承与多态
  • 基于GEE与哨兵2号的土地覆盖分类方法及实现
  • Vue Swiper组件
  • n8n教程分享,从Github读取.md文档内容
  • MySQL(145)如何升级MySQL版本?
  • 【爬虫】04 - 高级数据存储
  • Fortran实战:快速解析气象NC数据