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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:16:14