Flutter 多语言&多主题实现

image.png

image.png

目录

  • 多语言实现
  • 多主题实现
  • 状态管理
  • 切换多语言
  • 切换多主题

多语言实现

1. AndroidStudio-> File -> Settings -> Plugins -> 安装 Flutter Inrl

image.png

2. AndroidStudio -> Tools -> Flutter Intl -> Initialize for the Project

会在项目里面生成 generated、l10n 文件。

image.png

3.AndroidStudio -> Tools -> Flutter Intl -> Add Locale (添加需要的语言)

image.png

4. 编写多语言

在 文件夹 l10n的 intl_en.arb,添加英文版变量;
在 文件夹 l10n的 intl_zh_CN.arb,添加中文版变量;

image.png

5. 使用

配置
localizationsDelegates: const [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate
],
supportedLocales: S.delegate.supportedLocales,
locale: currentLocale.value,
调用
S.of(context).testName

多主题

多主题的实现和多语言的思想一样,一对多的形式实现。
我没有采用 基于框架的ThemeData 进行编写,涉及到的颜色变量较少,直接 写个实体类进行开展。

1. 编写一个 主题实体类

//主题枚举
enum AppThemeEnum { defaultTheme, blackTheme }

//主题实体类
class ThemeBean {
  //主题色
  Color primaryColor;

  //title 浅标题颜色
  Color titleLightColor;

  //title 深颜色
  Color titleBlackColor;

  //主背景色
  Color mainBgColor;

  //二级背景色
  Color secondLevelMainBgColor;

  //未选中颜色
  Color unselectedWidgetColor;

  //选中颜色
  Color activeColor;

  //下划线颜色
  Color underlineColor;

  //底部导航栏颜色
  Color systemNavigationBarColor;

  Color secondLevelTitleColor;

  ThemeBean(
      this.primaryColor,
      this.titleLightColor,
      this.titleBlackColor,
      this.mainBgColor,
      this.unselectedWidgetColor,
      this.activeColor,
      this.underlineColor,
      this.systemNavigationBarColor,
      this.secondLevelTitleColor,
      this.secondLevelMainBgColor
      );
}

2. 声明两种主题

//默认主题
ThemeBean defaultTheme = ThemeBean(
    //主题色
    Colors.blue,
    //主标题浅色
    Colors.white,
    //主标题深色
    Color(0xff333333),
    //主背景色
    Colors.white,
    //未选中颜色
    Colors.grey,
    //选中颜色
    Colors.blue,
    //下划线颜色
    Color(0xffe6e6e6),
    //底部导航栏颜色
    Color(0xfff2f2f2),
    //二级标题颜色
    Color(0xff666666),
    //二级背景色
    Color(0xffffffff));


//暗黑主题
ThemeBean blackTheme = ThemeBean(
    //主题色
    Color(0xff111111),
    //主标题浅色
    Colors.white,
    //主标题深色
    Colors.white,
    //主背景色
    Color(0xff111111),
    //未选中颜色
    Color(0xff2c2c2c),
    //选中颜色
    Color(0xff2c2c2c),
    //下划线颜色
    Color(0xff3b3b3b),
    //底部导航栏颜色
    Color(0xff010101),
    //二级标题颜色
    Color(0xff979797),
    //二级背景色
    Color(0xff424242));

3.编写获取方法

//主题数组
Map<AppThemeEnum, ThemeBean> themeMap = {
  AppThemeEnum.defaultTheme: defaultTheme,
  AppThemeEnum.blackTheme: blackTheme
};

//获取颜色
ThemeBean get themeColor => themeMap[
    Provider.of<CurrentTheme>(navigatorKey.currentState.overlay.context)
        .getThisThemeColor];

4. 使用

  themeColor.secondLevelMainBgColor

状态管理

使用Provider 进行状态管理、同步。

///多语言
class CurrentLocale with ChangeNotifier
{
  Locale _locale = const Locale('zh','CN');

  Locale get value => _locale;
  void setLocale(locale)
  {
    _locale = locale;
    notifyListeners();
  }
}

///多主题
class CurrentTheme extends ChangeNotifier{
  //当前主题
  AppThemeEnum _nowAppTheme = AppThemeEnum.defaultTheme;

  AppThemeEnum get getThisThemeColor => _nowAppTheme;

  setTheme(AppThemeEnum themeColor) {
    _nowAppTheme = themeColor;
    notifyListeners();
  }

}
  runApp(MultiProvider(
    providers: [
      ChangeNotifierProvider(create: (context) => CurrentLocale()),
      ChangeNotifierProvider(create: (context) => CurrentTheme())
      //此是语言状态注册
    ],
    child: MyApp(),
  ));

class MyApp extends StatelessWidget {
  Color _themeColor;

  @override
  Widget build(BuildContext context) {
    return Consumer<CurrentLocale>(builder: (context, currentLocale, child) {
      return Consumer<CurrentTheme>(
          builder: (context, themeColor, child) {
            if (themeMap[themeColor.getThisThemeColor] != null) {
              _themeColor =
                  themeMap[themeColor.getThisThemeColor].primaryColor;
            }
            Future.delayed(Duration(milliseconds: 100), () {
              SystemUiOverlayStyle systemUiOverlayStyle =
              SystemUiOverlayStyle(
                systemNavigationBarColor:
                themeMap[themeColor.getThisThemeColor]
                    .systemNavigationBarColor, //虚拟按键背景色
              );
              SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
            });

            return MaterialApp(
              navigatorKey: navigatorKey,
              title: '多主题多语言',
              theme: ThemeData(
                  fontFamily: "hk",
                  primaryColor: _themeColor,
                  floatingActionButtonTheme: FloatingActionButtonThemeData(
                      backgroundColor: _themeColor),
                  bottomAppBarColor: _themeColor),
              // home: Splash()),
              home: Home(),
              localizationsDelegates: const [
                S.delegate,
                GlobalMaterialLocalizations.delegate,
                GlobalCupertinoLocalizations.delegate,
                GlobalWidgetsLocalizations.delegate
              ],
              supportedLocales: S.delegate.supportedLocales,
              locale: currentLocale.value,
              localeListResolutionCallback: (locales, supportedLocales) {
                return;
              },
            );
          });
    });
  }
}

切换多语言

S.load(Locale("zh", "CN"));
Provider.of<CurrentLocale>(context,listen: false)
.setLocale(const Locale('zh', "CH"));

切换多主题

Provider.of<CurrentTheme>(context, listen: false)
.setTheme(AppThemeEnum.defaultTheme);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359

推荐阅读更多精彩内容