You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在无Context的情况下访问Flutter本地化功能

在Clean Architecture架构下无Context访问Flutter本地化的方案

在Clean Architecture架构中,数据层(Repository)不能直接依赖UI层的Context,要实现无Context访问本地化,核心是通过依赖注入+抽象服务的方式,把本地化能力解耦出来。

步骤1:定义本地化服务抽象类

在领域层创建抽象的本地化服务接口,确保数据层只依赖抽象,符合依赖倒置原则:

// 领域层抽象
abstract class AppLocalizationService {
  String translate(String key, [Map<String, String>? replacements]);
}

步骤2:实现本地化服务

在UI层(或基础设施层)实现这个抽象类,依赖Flutter官方的AppLocalizations:

// 依赖Flutter官方本地化实现
class FlutterAppLocalizationService implements AppLocalizationService {
  final AppLocalizations _localizations;

  FlutterAppLocalizationService(this._localizations);

  @override
  String translate(String key, [Map<String, String>? replacements]) {
    String text = _localizations.translate(key);
    // 处理占位符替换(如果需要)
    replacements?.forEach((key, value) {
      text = text.replaceAll('{$key}', value);
    });
    return text;
  }
}

步骤3:注入本地化服务到Repository

修改你的UserRepository,通过构造函数注入AppLocalizationService,这样Repository就不再依赖Context:

class UserRepository {
  final AppLocalizationService _localizationService;

  // 构造函数注入本地化服务
  UserRepository(this._localizationService);

  Future<Either<Failure, Unit>> logOut() async {
    try {
      return const Right(unit);
    } catch (e) {
      // 使用本地化服务翻译错误信息
      final errorMessage = _localizationService.translate('auth_failure_logout');
      return Left(AuthFailure(errorMessage));
    }
  }
}

步骤4:初始化并传递服务

在应用启动时(比如MaterialApp的builder或依赖注入容器中),获取当前的AppLocalizations实例,创建FlutterAppLocalizationService,并传递给UserRepository:

// 示例:在MaterialApp中初始化
MaterialApp(
  localizationsDelegates: AppLocalizations.localizationsDelegates,
  supportedLocales: AppLocalizations.supportedLocales,
  home: Builder(builder: (context) {
    // 获取当前本地化实例
    final localizations = AppLocalizations.of(context)!;
    // 创建本地化服务
    final localizationService = FlutterAppLocalizationService(localizations);
    // 初始化Repository
    final userRepo = UserRepository(localizationService);
    // 传递给页面或使用依赖注入容器管理
    return HomePage(userRepo: userRepo);
  }),
);

补充说明

  • 如果你使用依赖注入框架(比如GetIt、Riverpod),可以把AppLocalizationService注册为单例,在Repository中直接获取,无需手动传递。
  • 确保你的本地化字符串文件(比如app_en.arb、app_zh.arb)中包含对应的错误键值,比如"auth_failure_logout": "登出失败,请稍后重试"。

内容的提问来源于stack exchange,提问作者ibrahim Eltayfe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:40:31