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(),);}
}