iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 18
0
Mobile Development

用 Flutter 開發一個 Android App 吧系列 第 18

用 Flutter 開發一個 Android App 吧 - Day 18. 個人頁面(大改)

本系列同步發表在 個人部落格,歡迎大家關注~

個人頁面 - Star 頁面

在 Day 8 的時候,個人頁面的 Star Tab,我並沒有實作 StarRepoPage

終於今天要連接 GitHub API,不得不實作它了,直接來看程式碼。

lib/pages/profile/star.dart

class StarRepoPage extends StatefulWidget {
  @override
  _StarRepoPageState createState() => _StarRepoPageState();
}

class _StarRepoPageState extends State<StarRepoPage> {
  Future<List<Repository>> starRepoList;

  @override
  void initState() {
    super.initState();
    starRepoList = fetchStarRepos();
  }

  @override
  Widget build(BuildContext context) {
    return Scrollbar(
      child: RefreshIndicator(
        child: FutureBuilder(...),
        onRefresh: () async {
          await Future.delayed(Duration(seconds: 1));
          setState(() {
            starRepoList = fetchStarRepos();
          });
        },
      ),
    );
  }

  Future<List<Repository>> fetchStarRepos() async {
    CurrentUser user = await githubClient.users.getCurrentUser();
    List jsonResult = await githubClient.getJSON(
      "/users/${user.login}/starred",
      params: {"pages": "1"},
    );
    List<Repository> starRepos = jsonResult.map((star) {
      return Repository.fromJSON(star);
    }).toList();
    return starRepos;
  }
}

其實主要架構跟 RepoPage 很像,分成兩大部份:

  1. build 函數: 一樣使用 FutureBuilder 來構建載入 star 資料的畫面,其中在 star 列表內也是使用昨天寫的 RepoTile
  2. fetchStarRepos 函數: 稍微複雜些,主要是套件中 listStarredByUser 函數中似乎沒提供 pages 參數,而我的 star 項目多達 300 多個,光是載入這些資料就等個 5~7 秒,所以索性就透過 getJSON 直接調用 GitHub API 了。

個人頁面 - 追隨者、追隨頁面

lib/pages/profile/follow.dart

class FollowerPage extends StatefulWidget {
  @override
  _FollowerPageState createState() => _FollowerPageState();
}

class _FollowerPageState extends State<FollowerPage> {
  Future<List<User>> followerList;

  @override
  void initState() {
    super.initState();
    followerList = fetchFollowers();
  }

  @override
  Widget build(BuildContext context) {
    return Scrollbar(
      child: RefreshIndicator(
        child: FutureBuilder(...),
        onRefresh: () async {
          await Future.delayed(Duration(seconds: 1));
          setState(() {
            followerList = fetchFollowers();
          });
        },
      ),
    );
  }

  Future<List<User>> fetchFollowers() async {
    CurrentUser user = await githubClient.users.getCurrentUser();
    return githubClient.users.listUserFollowers(user.login).toList();
  }
}

我想大家猜到了,FollowerPageFollowingPage 其實跟其他的頁面相去不遠,一樣也是用 FutureBuilder 搭配昨天自製的 UserTile
也同樣有對應的異步任務函數 fetchFollowersfetchFollowing

這邊比較複雜的只有 fetchFollowing

  Future<List<User>> fetchFollowing() async {
    CurrentUser user = await githubClient.users.getCurrentUser();
    List jsonResult = await githubClient.getJSON(
      "/users/${user.login}/following",
    );
    List<User> followingUsers = jsonResult.map((user) {
      return User.fromJson(user);
    }).toList();
    return followingUsers;
  }

這邊跟前一節 fetchStarRepos 一樣,套件目前沒有 listUserFollowing 這函數,所以也只能透過 getJSON 直接調用 GitHub API 拉~

--

今日成果

day18-1.gif


上一篇
用 Flutter 開發一個 Android App 吧 - Day 17. 搜尋頁面(改)、自製 GitHub Tiles
下一篇
用 Flutter 開發一個 Android App 吧 - Day 19. JSON 序列化 及 如何應用在 App 中
系列文
用 Flutter 開發一個 Android App 吧30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
Robby
iT邦新手 5 級 ‧ 2020-01-25 15:49:37

不好意思...又是菜鳥我^^

內文有個極小錯誤,給大家參考:

[ lib/pages/profile/star.dart ]

List<Repository> starRepos = jsonResult.map((star) {
      return Repository.fromJSON(star);
    }).toList();

這裡小小拼錯字: fromJSON,應該為 fromJson

Bbsonlin iT邦新手 4 級 ‧ 2020-01-30 11:03:52 檢舉

感謝提醒~
之前我寫這系列時 github 套件版本是 fromJSON,不過他新版好像改成 fromJson 了 XD

Bbsonlin iT邦新手 4 級 ‧ 2020-01-30 11:20:20 檢舉

對了 如果有其他問題也可以在我 GitHub gitme_reborn Repo 上開 issue,也可以發 PR 給我歐~

我要留言

立即登入留言