Flutter无法获取正确地区码,始终显示us或en求助
解决Flutter获取设备语言/地区码始终为en/us的问题
核心原因
你当前用的Localizations.localeOf(context)获取的是App自身的本地化配置Locale,不是设备系统层面的Locale。如果App没配置多语言支持,会默认用en_US作为 fallback locale,导致不管设备怎么改都返回en/us。
解决方案
1. 配置App多语言支持(让Localizations.localeOf匹配系统设置)
在MaterialApp(或CupertinoApp)中添加本地化配置,指定支持的语言列表和代理:
import 'package:flutter_localizations/flutter_localizations.dart'; class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( // 按需添加你需要支持的语言地区 supportedLocales: const [ Locale('en', 'US'), Locale('zh', 'CN'), Locale('ja', 'JP'), ], // 必须添加的本地化代理 localizationsDelegates: const [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], // 系统语言不在支持列表时的 fallback 选项 fallbackLocale: const Locale('en', 'US'), home: YourHomePage(), ); } }
配置完成后,Localizations.localeOf(context)会自动匹配设备的系统语言设置(前提是系统语言在supportedLocales列表中)。
2. 直接获取设备系统原生Locale(不依赖App本地化)
如果不需要App多语言支持,只想读取设备的系统语言/地区,直接用dart:ui的API:
import 'dart:ui'; @override Widget build(BuildContext context) { // 获取设备原生Locale Locale systemLocale = window.locale; String? localeCode = systemLocale.countryCode; String? languageCode = systemLocale.languageCode; return Scaffold( body: IndexedStack( index: _currentIndex, children: [ HomeScreen(localeCode, languageCode), ], ), ); }
window.locale返回的是设备首选Locale,不受App本地化配置影响。
3. 监听系统Locale变化(实时更新UI)
如果要在用户修改设备语言时实时更新UI,添加监听逻辑:
import 'dart:ui'; import 'package:flutter/material.dart'; class YourHomePage extends StatefulWidget { @override _YourHomePageState createState() => _YourHomePageState(); } class _YourHomePageState extends State<YourHomePage> { late Locale _systemLocale; @override void initState() { super.initState(); _systemLocale = window.locale; // 监听系统Locale变更 WidgetsBinding.instance.platformDispatcher.onLocaleChanged = () { setState(() { _systemLocale = window.locale; }); }; } @override Widget build(BuildContext context) { String? localeCode = _systemLocale.countryCode; String? languageCode = _systemLocale.languageCode; return Scaffold( body: HomeScreen(localeCode, languageCode), ); } }
针对你现有代码的调整
确保传递给PomodoroPage的localeCode和languageCode是上述正确获取到的值,不管是App本地化的Locale还是系统原生Locale。
内容的提问来源于stack exchange,提问作者Tdayo
相关产品推荐
相关产品推荐

