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.pswp.cn/diannao/91802.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91802.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91802.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第十五屆全國大學生數學競賽初賽試題(非數學專業類A卷)

第十五屆全國大學生數學競賽初賽試題(非數學專業類A卷) 文章目錄第十五屆全國大學生數學競賽初賽試題(非數學專業類A卷)題目速覽逐題詳解題目速覽 求極限&#xff1a; lim?x→3x39?62?x3?23.\lim\limits_{x \to 3} \frac{\sqrt{x^3 9} - 6}{2 - \sqrt{x^3 - 23}} \rule{2…

ROS1/Linux——Ubuntu、ROS1虛擬機環境配置

ROS1/Linux——Ubuntu、ROS1虛擬機環境配置 文章目錄ROS1/Linux——Ubuntu、ROS1虛擬機環境配置編輯時間&#xff1a;系統環境Linux鏡像下載Ubuntu相關鏈接iso鏡像下載VMware操作虛擬機安裝步驟基礎設置設置語言設置窗口分辨率、圖標大小等終端固定在左側欄顯示隱藏文件夾其他問…

萬字解析LVS集群

一、集群和分布式介紹1.1、誕生的原因單臺設備 “又貴又弱又容易掛”&#xff0c;扛不住現代業務的 “海量訪問、海量數據、復雜計算”&#xff1b;集群 / 分布式讓多臺設備 “抱團干活”&#xff0c;分擔壓力&#xff08;流量、存儲、計算&#xff09;&#xff0c;還能 “壞了…

關于博客后續內容會以xmind內容轉markdown格式來呈現

自己感覺不正確的地方 一直感覺學啥東西記到博客里&#xff0c;這樣就方便后續回顧或者查找 但csdn貌似不適合全局搜索&#xff0c;也就是我居然先要知道我對應的模糊點對應到哪篇文章&#xff0c;然后再到那篇文章里找&#xff0c;簡直麻煩死了&#xff0c;而且另外一個毛病是…

Python - 數據分析三劍客之Pandas

閱讀前可參考NumPy文章 https://blog.csdn.net/MinggeQingchun/article/details/148253682https://blog.csdn.net/MinggeQingchun/article/details/148253682 ?Pandas是Python中一個強大的開源數據分析庫&#xff0c;專門用于處理結構化數據&#xff08;如表格、時間序列等&…

深度解析:Python實戰京東資產拍賣平臺爬蟲,從ID抓取到詳情數據落地

深度解析:Python實戰京東資產拍賣平臺爬蟲,從ID抓取到詳情數據落地 對爬蟲、逆向感興趣的同學可以查看文章,一對一小班教學(系統理論和實戰教程)、提供接單兼職渠道:https://blog.csdn.net/weixin_35770067/article/details/142514698 文章目錄 深度解析:Python實戰京東…

ServletConfig 接口詳解

ServletConfig 接口詳解 1. 核心概念 ServletConfig 是 Servlet 規范中定義的核心接口&#xff0c;用于在 Servlet 初始化階段向 Servlet 傳遞配置信息。每個 Servlet 都有自己獨立的 ServletConfig 對象。 2. 關鍵特性特性說明唯一性每個 Servlet 實例擁有獨立的 ServletConfi…

Maven學習總結(62)—— Maven 打包瘦身和提速解決方案

臃腫的 Maven 項目 在 Java 項目開發中,Maven 作為強大的項目管理和構建工具,極大地簡化了依賴管理和項目構建過程。但隨著項目的不斷演進,依賴的 Jar 包越來越多,我們的 Maven 項目也逐漸變得臃腫不堪。曾經,我參與維護一個大型的 Spring Boot 項目,隨著業務功能的不斷…

【Qt開發】Qt的背景介紹(三)-> 認識Qt Creator

目錄 1 -> Qt Creator概覽 2 -> 使用Qt Creator創建項目 2.1 -> 新建項目 2.2 -> 選擇項目模板 2.3 -> 選擇項目路徑 2.4 -> 選擇構建系統 2.5 -> 填寫類信息設置界面 2.6 -> 選擇語言和翻譯文件 2.7 -> 選擇Qt套件 2.8 -> 選擇版本控…

HTML5中的自定義屬性

自定義屬性&#xff08;Custom Attributes&#xff09; 允許在標準 HTML 屬性之外&#xff0c;為元素添加額外的元數據&#xff08;metadata&#xff09;。 1. 標準方式&#xff1a;data-* 屬性 HTML5 引入了 data-* 前綴的自定義屬性規范&#xff0c;所有以 data- 開頭的屬性都…

前端項目利用Gitlab CI/CD流水線自動化打包、部署云服務

疊甲前言 本文僅作為個人學習GitLab的CI/CD功能記錄&#xff0c;不適合作為專業性指導&#xff0c;如有紕漏&#xff0c;煩請君指正。 Gitlab的CI/CD做什么用的 自工作以來&#xff0c;去過大大小小公司&#xff0c;有一些公司技術人員專業性欠佳&#xff0c;每當產品經理或…

基于typescript嚴格模式以實現undo和redo功能為目標的命令模式代碼參考

下面是一個完整的、嚴格模式下的 TypeScript 實現&#xff0c;包含 CommandManager、Command 和 CompositeCommand 類&#xff0c;支持 undo/redo 功能。完整實現代碼1. Command 接口和基類// src/commands/ICommand.ts export interface ICommand {execute(): void;undo(): vo…

2022年CIE SCI2區TOP,NSGA-II+直升機-無人機搜救任務分配,深度解析+性能實測

目錄1.摘要2.數學模型3.求解方法4.結果展示5.參考文獻6.代碼獲取7.算法輔導應用定制讀者交流1.摘要 無人機任務分配對于保障搜救活動高效有序開展具有重要意義&#xff0c;但現有研究較少考慮無人機作業環境與性能對任務分配的影響。針對低空風場和地形因素對無人機能耗與性能…

暑期算法訓練.4

目錄 15.力扣 904.水果成籃 15.1 題目解析&#xff1a; 15.2 算法思路&#xff1a; 15.2.1 暴力解法&#xff1a; 15.2.1 滑動窗口 15.3代碼演示&#xff1a; 15.4 總結反思&#xff1a; 16 力扣 438.找出字符串中所有字母的異位詞 16.1 題目解析&#xff1a; 16.2算法…

關于個人博客系統的測試報告

1&#xff09;項目背景2&#xff09;項目功能介紹 登陸寫博客/編輯已存在博客刪除博客注銷 2&#xff09;基于項目功能設計相關測試用例3&#xff09;基于測試用例編寫自動化測試 準備工作登陸界面相關博客首頁相關博客詳情頁相關編輯博客相關刪除博客相關注銷相關 4&#xff0…

Spring Boot 與微服務詳細總結

一、Spring Boot 核心概述 Spring Boot 是簡化 Spring 應用開發的框架&#xff0c;作為 Spring 技術棧的整合方案和 J2EE 開發的一站式解決方案&#xff0c;其核心優勢體現在&#xff1a; 快速創建獨立運行的 Spring 項目&#xff0c;輕松集成主流框架內置 Servlet 容器&…

輕松上手:從零開始啟動第一個 Solana 測試節點

嗨&#xff0c;各位技術愛好者們&#xff01; 大家是否對 Solana 的“光速”交易處理能力感到好奇&#xff1f;或者你是一名開發者&#xff0c;正準備在 Solana 上構建下一個殺手級 dApp&#xff1f;無論大家是出于學習目的還是實際開發需求&#xff0c;親手運行一個 Solana 節…

Gerrit workflow

提交代碼 每次提交代碼前&#xff0c;先執行 git pull --rebase &#xff0c;確保已經合并天上代碼&#xff0c;解決沖突 git add git commit -m git push origin HEAD:refs/for/{BRANCH_NAME} 可考慮設置 alias 方式&#xff0c;參考下文 CR-2 情況處理(verify-1情況一樣處理…

量化交易如何查詢CFD指數實時行情

CFD即所謂的差價合約&#xff0c;是投資者在不擁有實際資產的情況下&#xff0c;交易金融市場的一種方式。最近筆者研究這一塊比較多&#xff0c;但查遍整個中文互聯網卻很少找到關于CFD實時行情的查詢教程。因此有了這篇文章。以下我將通過一個簡單的Python代碼示例&#xff0…

sql練習二

首先&#xff0c;建表。創建學生表和score表接著導入創建好基礎信息就可以開始做了。3、分別查詢student表和score表的所有記錄4、查詢student表的第2條到第5條記錄5、從student表中查詢計算機系和英語系的學生的信息6、從student表中查詢年齡小于22歲的學生信息7、從student表…