Flutter實戰(zhàn) 多語言和多主題

2021-03-09 15:14 更新

本實例 APP 中語言和主題都是可以設(shè)置的,而兩者都是通過ChangeNotifierProvider來實現(xiàn)的:我們在main函數(shù)中使用了Consumer2,依賴了ThemeModelLocaleModel,因此,當我們在語言和主題設(shè)置頁更該當前的配置后,Consumer2builder都會重新執(zhí)行,構(gòu)建一個新的MaterialApp,所以修改會立即生效。下面看一下語言和主題設(shè)置頁的實現(xiàn)。

#15.8.1 語言選擇頁

APP 語言選擇頁提供三個選項:中文簡體、美國英語、跟隨系統(tǒng)。我們將當前 APP 使用的語言高亮顯示,并且在后面添加一個“對號”圖標,實現(xiàn)如下:

  1. class LanguageRoute extends StatelessWidget {
  2. @override
  3. Widget build(BuildContext context) {
  4. var color = Theme.of(context).primaryColor;
  5. var localeModel = Provider.of<LocaleModel>(context);
  6. var gm = GmLocalizations.of(context);
  7. //構(gòu)建語言選擇項
  8. Widget _buildLanguageItem(String lan, value) {
  9. return ListTile(
  10. title: Text(
  11. lan,
  12. // 對APP當前語言進行高亮顯示
  13. style: TextStyle(color: localeModel.locale == value ? color : null),
  14. ),
  15. trailing:
  16. localeModel.locale == value ? Icon(Icons.done, color: color) : null,
  17. onTap: () {
  18. // 更新locale后MaterialApp會重新build
  19. localeModel.locale = value;
  20. },
  21. );
  22. }
  23. return Scaffold(
  24. appBar: AppBar(
  25. title: Text(gm.language),
  26. ),
  27. body: ListView(
  28. children: <Widget>[
  29. _buildLanguageItem("中文簡體", "zh_CN"),
  30. _buildLanguageItem("English", "en_US"),
  31. _buildLanguageItem(gm.auto, null),
  32. ],
  33. ),
  34. );
  35. }
  36. }

上面代碼邏輯很簡單,唯一需要注意的是我們在build(…)方法里面定義了_buildLanguageItem(…)方法,它和在LanguageRoute類中定義該方法的區(qū)別就在于:在build(…)內(nèi)定義的方法可以共享build(...)方法上下文中的變量,本例中是共享了localeModel。當然,如果_buildLanguageItem(…)的實現(xiàn)復(fù)雜一些的話不建議這樣做,此時最好是將其作為LanguageRoute類的方法。該頁面運行效果如圖15-6、15-7所示:

15-615-7

切換語言后立即生效。

#15.8.2 主題選擇頁

一個完整的主題Theme包括很多選項,這些選項在ThemeData中定義。本實例為了簡單起見,我們只配置主題顏色。我們提供幾種默認預(yù)定義的主題色供用戶選擇,用戶點擊一種色塊后則更新主題。主題選擇頁的實現(xiàn)代碼如下:

  1. class ThemeChangeRoute extends StatelessWidget{
  2. @override
  3. Widget build(BuildContext context) {
  4. return Scaffold(
  5. appBar: AppBar(
  6. title: Text(GmLocalizations.of(context).theme),
  7. ),
  8. body: ListView( //顯示主題色塊
  9. children: Global.themes.map<Widget>((e) {
  10. return GestureDetector(
  11. child: Padding(
  12. padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 16),
  13. child: Container(
  14. color: e,
  15. height: 40,
  16. ),
  17. ),
  18. onTap: () {
  19. //主題更新后,MaterialApp會重新build
  20. Provider.of<ThemeModel>(context).theme = e;
  21. },
  22. );
  23. }).toList(),
  24. ),
  25. );
  26. }
  27. }

運行效果如圖15-8所示:

15-8

點擊其它主題色塊后,APP 主題色立馬切換生效。

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號