Flutter中FCM通知的国际化问题
解决Flutter FCM前台接收时本地化标题无法通过AppLocalizations获取的问题
问题根源
后台FCM消息由Android系统直接处理,会自动读取res/values/string.xml里的本地化资源;但前台消息是Flutter层面接收,AppLocalizations对应的是Flutter项目自身的本地化文件(比如l10n目录下的ARB文件),和Android原生的string.xml资源不互通,所以找不到accountBlocked键。
可行解决方案
1. 同步Flutter与Android本地化资源
把Android string.xml中的键值对同步到Flutter的本地化配置文件中:
- 在Flutter项目的
l10n/app_en.arb(对应英文)中添加:"accountBlocked": "Account blocked" - 重新生成本地化代码(执行
flutter gen-l10n),之后AppLocalizations.of(context)!.accountBlocked就能正常获取值。
2. 通过MethodChannel读取Android原生资源(仅Android端适用)
如果不想同步资源,可以通过Flutter的MethodChannel调用Android原生方法读取string.xml:
- Flutter端代码:
import 'package:flutter/services.dart'; class NativeLocalization { static const _channel = MethodChannel('localization_channel'); static Future<String?> getString(String key) async { try { return await _channel.invokeMethod('getString', {'key': key}); } on PlatformException catch (_) { return null; } } } - Android端(
MainActivity.kt)代码:
使用时直接调用import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel class MainActivity : FlutterActivity() { private val CHANNEL = "localization_channel" override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> if (call.method == "getString") { val key = call.argument<String>("key") key?.let { val resId = resources.getIdentifier(it, "string", packageName) if (resId != 0) { result.success(getString(resId)) } else { result.error("KEY_NOT_FOUND", "String key not found", null) } } ?: result.error("INVALID_ARG", "Key cannot be null", null) } else { result.notImplemented() } } } }NativeLocalization.getString("accountBlocked")即可获取对应文本。
3. 调整FCM消息Payload(无需依赖本地资源)
发送FCM消息时,除了titleLocKey,可以直接携带目标语言的标题文本作为fallback,或者由后端根据用户的Locale发送对应语言的title字段,Flutter前台直接读取remoteMessage.notification?.title即可。
补充说明
不需要手动下载string.xml,它已经存在于Android项目的资源目录中。问题核心是Flutter与Android原生的本地化资源池相互独立,只要通过上述方法打通两者的资源访问或者同步资源,就能解决前台无法获取本地化标题的问题。
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

