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)如下:

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

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

#API緩存策略信息

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

{
  "enable":true, // 是否啟用緩存
  "maxAge":1000, // 緩存的最長(zhǎng)時(shí)間,單位(秒)
  "maxCount":100 // 最大緩存數(shù)
}

#用戶信息

用戶信息(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),但是在本示例中,為了簡(jiǎn)單起見,我們使用賬號(hào)密碼登錄,因此我們需要保存用戶的密碼。

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

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

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

#項(xiàng)目信息

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

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

#生成Dart Model類

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

flutter packages pub run json_model

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

├── models
│   ├── cacheConfig.dart
│   ├── cacheConfig.g.dart
│   ├── index.dart
│   ├── profile.dart
│   ├── profile.g.dart
│   ├── repo.dart
│   ├── repo.g.dart
│   ├── user.dart
│   └── 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 的使用非常簡(jiǎn)單,讀者可以自行查看其文檔,在此不再贅述。

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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)