如何在无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
相关产品推荐
相关产品推荐

