Flutter實(shí)戰(zhàn) Model類定義

2021-03-09 14:57 更新

本節(jié)我們先梳理一下 APP 中將用到的數(shù)據(jù),然后生成相應(yīng)的 Dart Model 類。Json 文件轉(zhuǎn) Dart Model 的方案采用前面介紹過的 json_model 包方案

#Github 賬號(hào)信息

登錄 Github 后,我們需要獲取當(dāng)前登錄者的 Github 賬號(hào)信息,Github API 接口返回 Json 結(jié)構(gòu)如下:

  1. {
  2. "login": "octocat", //用戶登錄名
  3. "avatar_url": "https://github.com/images/error/octocat_happy.gif", //用戶頭像地址
  4. "type": "User", //用戶類型,可能是組織
  5. "name": "monalisa octocat", //用戶名字
  6. "company": "GitHub", //公司
  7. "blog": "https://github.com/blog", //博客地址
  8. "location": "San Francisco", // 用戶所處地理位置
  9. "email": "octocat@github.com", // 郵箱
  10. "hireable": false,
  11. "bio": "There once was...", // 用戶簡介
  12. "public_repos": 2, // 公開項(xiàng)目數(shù)
  13. "followers": 20, //關(guān)注該用戶的人數(shù)
  14. "following": 0, // 該用戶關(guān)注的人數(shù)
  15. "created_at": "2008-01-14T04:33:35Z", // 賬號(hào)創(chuàng)建時(shí)間
  16. "updated_at": "2008-01-14T04:33:35Z", // 賬號(hào)信息更新時(shí)間
  17. "total_private_repos": 100, //該用戶總的私有項(xiàng)目數(shù)(包括參與的其它組織的私有項(xiàng)目)
  18. "owned_private_repos": 100 //該用戶自己的私有項(xiàng)目數(shù)
  19. ... //省略其它字段
  20. }

我們?cè)凇癹sons”目錄下創(chuàng)建一個(gè)“user.json”文件保存上述信息。

#API緩存策略信息

由于 Github 服務(wù)器在國內(nèi)訪問速度較慢,我們對(duì) Github API 應(yīng)用一些簡單的緩存策略。我們?cè)凇癹sons”目錄下創(chuàng)建一個(gè)“cacheConfig.json”文件緩存策略信息,定義如下:

  1. {
  2. "enable":true, // 是否啟用緩存
  3. "maxAge":1000, // 緩存的最長時(shí)間,單位(秒)
  4. "maxCount":100 // 最大緩存數(shù)
  5. }

#用戶信息

用戶信息(Profile)應(yīng)包括如下信息:

  1. Github 賬號(hào)信息;由于我們的 APP 可以切換賬號(hào)登錄,且登錄后再次打開則不需要登錄,所以我們需要對(duì)用戶賬號(hào)信息和登錄狀態(tài)進(jìn)行持久化。
  2. 應(yīng)用使用配置信息;每一個(gè)用戶都應(yīng)有自己的 APP 配置信息,如主題、語言、以及數(shù)據(jù)緩存策略等。
  3. 用戶注銷登錄后,為了便于用戶在退出 APP 前再次登錄,我們需要記住上次登錄的用戶名。

需要注意的是,目前 Github 有三種登錄方式,分別是賬號(hào)密碼登錄、oauth 授權(quán)登錄、二次認(rèn)證登錄;這三種登錄方式的安全性依次加強(qiáng),但是在本示例中,為了簡單起見,我們使用賬號(hào)密碼登錄,因此我們需要保存用戶的密碼。

注意:在這里需要提醒讀者,在登錄場景中,保護(hù)用戶賬號(hào)安全是一個(gè)非常重要且永恒的話題,在實(shí)際開發(fā)中應(yīng)嚴(yán)格杜絕直接明文存儲(chǔ)用戶賬密的行為。

我們?cè)凇癹sons”目錄下創(chuàng)建一個(gè)“profile.json”文件,結(jié)構(gòu)如下:

  1. {
  2. "user":"$user", //Github賬號(hào)信息,結(jié)構(gòu)見"user.json"
  3. "token":"", // 登錄用戶的token(oauth)或密碼
  4. "theme":5678, //主題色值
  5. "cache":"$cacheConfig", // 緩存策略信息,結(jié)構(gòu)見"cacheConfig.json"
  6. "lastLogin":"", //最近一次的注銷登錄的用戶名
  7. "locale":"" // APP語言信息
  8. }

#項(xiàng)目信息

由于 APP 主頁要顯示其所有項(xiàng)目信息,我們?cè)凇癹sons”目錄下創(chuàng)建一個(gè)“repo.json”文件保存項(xiàng)目信息。通過參考 Github 獲取項(xiàng)目信息的 API 文檔,定義出最終的“repo.json”文件結(jié)構(gòu),如下:

  1. {
  2. "id": 1296269,
  3. "name": "Hello-World", //項(xiàng)目名稱
  4. "full_name": "octocat/Hello-World", //項(xiàng)目完整名稱
  5. "owner": "$user", // 項(xiàng)目擁有者,結(jié)構(gòu)見"user.json"
  6. "parent":"$repo", // 如果是fork的項(xiàng)目,則此字段表示fork的父項(xiàng)目信息
  7. "private": false, // 是否私有項(xiàng)目
  8. "description": "This your first repo!", //項(xiàng)目描述
  9. "fork": false, // 該項(xiàng)目是否為fork的項(xiàng)目
  10. "language": "JavaScript",//該項(xiàng)目的主要編程語言
  11. "forks_count": 9, // fork了該項(xiàng)目的數(shù)量
  12. "stargazers_count": 80, //該項(xiàng)目的star數(shù)量
  13. "size": 108, // 項(xiàng)目占用的存儲(chǔ)大小
  14. "default_branch": "master", //項(xiàng)目的默認(rèn)分支
  15. "open_issues_count": 2, //該項(xiàng)目當(dāng)前打開的issue數(shù)量
  16. "pushed_at": "2011-01-26T19:06:43Z",
  17. "created_at": "2011-01-26T19:01:12Z",
  18. "updated_at": "2011-01-26T19:14:43Z",
  19. "subscribers_count": 42, //訂閱(關(guān)注)該項(xiàng)目的人數(shù)
  20. "license": { // 該項(xiàng)目的開源許可證
  21. "key": "mit",
  22. "name": "MIT License",
  23. "spdx_id": "MIT",
  24. "url": "https://api.github.com/licenses/mit",
  25. "node_id": "MDc6TGljZW5zZW1pdA=="
  26. }
  27. ...//省略其它字段
  28. }

#生成Dart Model類

現(xiàn)在,我們需要的 Json 數(shù)據(jù)已經(jīng)定義完畢,現(xiàn)在只需要運(yùn)行 json_model package 提供的命令來通過 json 文件生成相應(yīng)的 Dart 類:

  1. flutter packages pub run json_model

命令執(zhí)行成功后,可以看到 lib/models 文件夾下會(huì)生成相應(yīng)的 Dart Model 類:

  1. ├── models
  2. ├── cacheConfig.dart
  3. ├── cacheConfig.g.dart
  4. ├── index.dart
  5. ├── profile.dart
  6. ├── profile.g.dart
  7. ├── repo.dart
  8. ├── repo.g.dart
  9. ├── user.dart
  10. └── user.g.dart

#數(shù)據(jù)持久化

我們使用 shared_preferences 包來對(duì)登錄用戶的 Profile 信息進(jìn)行持久化。shared_preferences 是一個(gè) Flutter 插件,它通過 Android 和 iOS 平臺(tái)提供的機(jī)制來實(shí)現(xiàn)數(shù)據(jù)持久化。由于 shared_preferences 的使用非常簡單,讀者可以自行查看其文檔,在此不再贅述。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)