Flutter如何针对不同的flavor使用不同的intl

在Flutter项目中配置了多个flavor,现在需要为每个flavor使用不同的intl国际化文件。比如dev flavor要用中文,prod flavor要用英文。尝试在flutter_gen的配置中指定不同路径,但运行时报错找不到文件。请问如何正确根据flavor动态加载不同的arb文件?需要修改pubspec.yaml还是单独配置每个flavor的构建参数?

2 回复

在Flutter中,为不同flavor使用不同的intl文件,可通过配置flutter_gen或自定义脚本实现。在pubspec.yaml中定义多个资源路径,根据flavor选择对应的.arb文件路径,生成不同的本地化类。

更多关于Flutter如何针对不同的flavor使用不同的intl的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中,针对不同的 flavor 使用不同的国际化(intl)资源,可以通过以下步骤实现:

1. 配置 Flavors

android/app/build.gradle 和 iOS 配置中定义 flavors,例如:

flavorDimensions "env"
productFlavors {
    dev {
        dimension "env"
        applicationIdSuffix ".dev"
    }
    prod {
        dimension "env"
    }
}

2. 组织国际化文件

在项目根目录创建 flavors 对应的资源文件夹结构:

lib/l10n/
  - intl_en.arb (通用资源)
  - dev/
    - intl_en.arb (dev 特定资源)
  - prod/
    - intl_en.arb (prod 特定资源)

3. 生成 Dart 代码

使用 flutter gen-l10n 命令生成本地化类。在 pubspec.yaml 中配置:

flutter:
  generate: true
  l10n:
    arb-dir: lib/l10n
    output-dir: lib/generated/l10n

4. 动态加载资源

在应用启动时,根据当前 flavor 选择对应的 ARB 文件路径:

import 'package:flutter/material.dart';
import 'generated/l10n.dart';

void main() {
  // 获取当前 flavor(需通过 --dart-define 或其他方式传递)
  const flavor = String.fromEnvironment('FLAVOR', defaultValue: 'dev');
  
  runApp(MyApp(flavor: flavor));
}

class MyApp extends StatelessWidget {
  final String flavor;
  
  const MyApp({super.key, required this.flavor});
  
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: S.localizationsDelegates,
      supportedLocales: S.supportedLocales,
      // 根据 flavor 自定义本地化
      onGenerateTitle: (context) {
        if (flavor == 'dev') {
          return '${S.of(context).appTitle} (Dev)';
        }
        return S.of(context).appTitle;
      },
      home: MyHomePage(),
    );
  }
}

5. 构建时指定 Flavor

运行应用时传递 flavor 参数:

flutter run --dart-define=FLAVOR=dev

关键点:

  • ARB 文件合并:基础 intl_en.arb 中的键会被 flavor 特定文件覆盖。
  • 代码生成:确保 flutter gen-l10n 能正确识别所有 ARB 文件。
  • 资源隔离:不同 flavor 的差异化文本在对应目录中维护。

通过这种方式,可以灵活管理不同环境下的国际化文本,同时保持代码清晰。

回到顶部