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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:42:20