本系列同步發表在 個人部落格,歡迎大家關注~
這次的鐵人賽在設定頁面上,我想完成 2 個設定功能,主題(Theme)和語言(Language)。
從設計圖上可以看出來,設定頁面一部分是可以開合的列表。
這個一樣是源自 Material Design 的列表控制章節中的展開和閉合(Expand and collapse)
Flutter 中對應的 Widget 就是 ExpansionTile
,它可以跟 ListTile
一樣直接使用在 ListView
裡面。
先直接來看看程式碼吧~
lib/pages/setting/setting.dart
import "package:flutter/material.dart";
import 'package:gitme_reborn/components/setting/theme_option.dart';
class SettingPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Setting"),
),
body: ListView(
children: <Widget>[
ExpansionTile(
leading: Icon(Icons.palette),
title: Text("Theme"),
children: <Widget>[
Wrap(
spacing: 8.0,
children: <Widget>[
ThemeOption(color: Colors.black),
ThemeOption(color: Colors.blue),
ThemeOption(color: Colors.blueGrey)
],
)
],
),
ListTile(
leading: Icon(Icons.language),
title: Text("Language"),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text("English"),
Icon(Icons.keyboard_arrow_right),
],
),
onTap: () {},
),
],
),
);
}
}
ThemeOption
是自己寫的 Widget,基本上就是一個可點選的顏色方塊。
至於顏色切換的功能,牽扯到我這系列規劃的第三部份-狀態管理,所以這功能後續才會完成喔~
lib/components/setting/theme_option.dart
import "package:flutter/material.dart";
class ThemeOption extends StatelessWidget {
const ThemeOption({
Key key,
this.color,
}) : super(key: key);
final Color color;
@override
Widget build(BuildContext context) {
return GestureDetector(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
width: 42.0,
height: 42.0,
child: DecoratedBox(
decoration: BoxDecoration(color: color),
),
),
),
onTap: () {},
);
}
}
先來看看完成的樣子吧~
點選 GIF 可直接看 Commit
這邊又使用到另一種的 ListTile - RadioListTile
,一樣也是可以直接使用在 ListView
裡面,它所完成的是單選擇功能。
RadioListTile(
title: Text("繁體中文"),
value: Language.traditionalChinese,
groupValue: _language,
onChanged: (Language value) {
setState(() {
_language = Language.traditionalChinese;
});
},
),
SettingLanguagePage
的詳細程式碼我就不貼上來了。
有興趣的人,可點選上面的 GIF,到 Gitme Reborn repo 看看~
小提醒:
- 設定頁面實際功能都牽扯到這系列規劃的第三部份-狀態管理,後續將會慢慢完成喔~
- 歡迎大家到 GitHub Star 這開源項目且持續關注~ ?
今天就容許小弟偷懶些,Day11 就先寫到這邊拉~~
參考