iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
Mobile Development

用30天學習做出我的第一個Flutter App系列 第 14

Day14 [Flutter通訊錄實作]-聯絡人列表頁面(2)

  • 分享至 

  • xImage
  •  
  1. 填入JSON資料及映射到ListView
    • 放置json檔

      • assets下建立data資料夾,然後把文章裡提供的records.json檔案放進資料夾裡
        https://ithelp.ithome.com.tw/upload/images/20230929/201630631HCk9RfWLV.png
      • 再來更新pubspec.yaml的程式碼,加入第57行
        https://ithelp.ithome.com.tw/upload/images/20230929/20163063GTpp5S1agy.png
    • 接著在lib下建立models資料夾然後建三個檔案:
      ( 1 ) Record.dart(用來獲取聯絡人資料)

      • 工廠建構式(factory constructors):可以不用每次創建新的實例,而是根據需要返回已有的實例或是創建新實例
      • Record.fromJson:這裡的建構式接受一個Map<String, dynamic>類型的JSON數據作為參數,然後使用這個數據來創建一個新的Record實例(聯絡人)並返回。
        https://ithelp.ithome.com.tw/upload/images/20230929/來持有聯絡人資料20163063W8w2K2tnBR.png

      ( 2 ) RecordList.dart(用來獲取聯絡人列表)

      • 宣告一個變數records,是一個元素為Record類別的List,初始值是一個空的列表(這裡範例程式碼是用new List()來初始化列表,但Dart2.2之後的版本已經不使用,而是直接用[])
      • RecordList.fromJson:這裡是要將JSON數據轉換為RecordList實例。先創建一個空的records列表,然後使用map函數遍歷parsedJson列表,將每個元素轉換為Record實例,並添加到records列表中。最後,創建一個新的RecordList,將剛剛的records返回。
        https://ithelp.ithome.com.tw/upload/images/20230929/20163063nMr7gUrUaw.png

      ( 3 ) RecordService.dart(用來進行讀取工作)

      • import rootBundle:是Flutter裡用於訪問本地資源文件的工具
      • import dart:convert:用來把JSON字串轉換為Dart實例
      • _loadRecordsAsset():要從本地資源文件中加載JSON資料。這裡使用 rootBundle的loadString方法,loadString會返回一個Future,當JSON數據加載完成時,才會返回JSON字串。
      • loadRecords():是Future類型的異步函數。用上面的_loadRecordsAsset()方法來獲取 JSON字串,然後json.decode將JSON字串解碼為Dart實例,最後建立一個RecordList返回。
        https://ithelp.ithome.com.tw/upload/images/20230929/20163063TiXyTSXIoa.png
      • Future:是Dart中用來表示非同步操作結果的類別。
        • 使用async來定義函數,這些函數可以返回Future
        • 使用await等待Future操作完成,然後繼續執行下一個步驟,才可以確保當前的操作完成後再執行後續程式碼。

今天先做到這裡!這部分有蠻多新的東西的,之後會再複習一下factory constructors跟Future!

參考資料:
https://www.appcoda.com.tw/flutter-basics/


上一篇
Day13 [Flutter通訊錄實作]-聯絡人列表頁面(1)
下一篇
Day15 [Flutter通訊錄實作]-聯絡人列表頁面(3)
系列文
用30天學習做出我的第一個Flutter App30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言