models/post_model.dart
- 定义
Post
数据模型 - 包含
fromJson()
方法用于解析 JSON
- 定义
controllers/post_controller.dart
- 管理帖子数据的获取和状态
- 使用
http
包请求 API - 通过
RxList
和RxBool
实现响应式状态管理
views/post_list_view.dart
- 展示帖子列表的 UI
- 使用
Obx
监听状态变化 - 包含加载中、错误和数据展示三种状态
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(),);}
}