本系列同步發表在 個人部落格,歡迎大家關注~
在首頁的部份除了 Day 14 看到的 Hacker News 之外,還有一個部份是要顯示 GitHub Trending (Project)。
我這邊延續 Day 14 的作法,新建 fetchGHTrends 方法以及修改 buildGHTrends 方法。
Future fetchGHTrends() async {
  List<Project> ghTrends = await githubTrendingClient.listProjects();
  if (this.mounted) {
    setState(() {
      _ghTrends = ghTrends;
    });
  }
}
fetchGHTrends 中直接搭配前三天開發的 githubTrendingClient 作使用囉~
buildGHTrends(BuildContext context) {
  if (_ghTrends == null) {
    return [
      Padding(
        padding: const EdgeInsets.all(16.0),
        child: Center(child: CircularProgressIndicator()),
      )
    ];
  } else {
    return ListTile.divideTiles(
            context: context,
            tiles: _ghTrends.sublist(0, 4).map((project) {
              return ListTile(
                title: Text("${project.fullName}"),
                subtitle: Row(
                  children: <Widget>[
                    Text("${project.language}"),
                    SizedBox(width: 16.0),
                    Text("★ ${project.stars}"),
                  ],
                ),
                onTap: () {},
              );
            }).toList())
        .toList();
  }
}
今天結束前的最後一節想做些小優化,想閉大家都知道 GitHub 上每個程式語言都有自己的色碼。
而在這個專案內大量的用到它,考慮到程式複用性和維護性,所以將 GitHub 語言標籤獨立出來變成一個 Widget。
lib/components/github_language_label.dart
import "package:flutter/material.dart";
import 'package:gitme_reborn/utils.dart';
class GithubLanguageLabel extends StatefulWidget {
  const GithubLanguageLabel({
    Key key,
    this.language,
    this.languageHexColor,
  }) : super(key: key);
  final String language;
  final String languageHexColor;
  @override
  _GithubLanguageLabelState createState() => _GithubLanguageLabelState();
}
class _GithubLanguageLabelState extends State<GithubLanguageLabel> {
  String _labelHexCode;
  @override
  void initState() {
    super.initState();
    searchLanguageColorHexCode(widget.language).then((labelHexCode) {
      setState(() {
        _labelHexCode = labelHexCode;
      });
    });
  }
  @override
  Widget build(BuildContext context) {
    Color labelColor;
    if (widget.languageHexColor != null) {
      labelColor = hexToColor(widget.languageHexColor);
    } else if (widget.language != null) {
      labelColor = _labelHexCode != null ? hexToColor(_labelHexCode) : Colors.black;
    }
    if (widget.language != null) {
      return Row(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          Text(
            "● ",
            style: TextStyle(color: labelColor, fontSize: 24.0),
          ),
          Text(widget.language),
        ],
      );
    } else {
      return SizedBox();
    }
  }
}
build 裡。github-colors 這個專案的 colors.json 加入到 assets 中。searchLanguageColorHexCode 來協助找出對應程式語言的色碼(Hex Code)。
Future<String> searchLanguageColorHexCode(String language) async {
  String githubColors =
      await rootBundle.loadString("assets/data/github-colors.json");
  var githubColorsMap = jsonDecode(githubColors);
  if (language != null) {
    return githubColorsMap[language]["color"];
  } else {
    return null;
  }
}
GithubLanguageLabel 應用在頁面(主頁面、倉庫頁面、搜尋頁面、趨勢頁面...)--
今日成果
