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

Flutter:如何在枚举中使用MaterialLocalizations获取区域默认值?

解决方案

方法一:使用intl包(推荐,无需Context且覆盖所有区域规则)

  1. 首先在pubspec.yaml中添加intl依赖:
dependencies:
  intl: ^0.19.0 # 可替换为最新版本
  1. 修改枚举的fromString方法,通过DateFormat获取系统区域默认的一周起始日:
import 'package:intl/intl.dart';

enum WeekStartsOn {
  sunday, monday;

  static WeekStartsOn fromString(String s) {
    final lowerCaseStr = s.toLowerCase();
    if (lowerCaseStr == "sunday") return sunday;
    if (lowerCaseStr == "monday") return monday;
    
    // 自动适配系统区域的一周起始日
    final firstDayOfWeek = DateFormat().firstDayOfWeek;
    // 1代表周日,2代表周一(符合国际区域标准)
    return firstDayOfWeek == 1 ? sunday : monday;
  }

  String toDisplayName() => switch (this) {
        WeekStartsOn.sunday => 'Sunday',
        WeekStartsOn.monday => 'Monday',
      };
}

DateFormat()会自动读取系统的区域设置,firstDayOfWeek属性已经封装了不同区域的一周起始规则,不需要手动维护区域列表,是最可靠的方式。

方法二:手动解析系统Locale(无需第三方包,但需维护区域规则)

如果不想引入intl包,可以通过dart:io的Platform.localeName获取系统Locale,手动判断起始日:

import 'dart:io';

enum WeekStartsOn {
  sunday, monday;

  static WeekStartsOn fromString(String s) {
    final lowerCaseStr = s.toLowerCase();
    if (lowerCaseStr == "sunday") return sunday;
    if (lowerCaseStr == "monday") return monday;
    
    // 获取系统Locale标识
    final systemLocale = Platform.localeName;
    // 手动维护周日起始的区域列表(示例,需根据需求扩展)
    final isSundayStart = ['en_US', 'en_CA', 'ja_JP'].contains(systemLocale);
    return isSundayStart ? sunday : monday;
  }

  String toDisplayName() => switch (this) {
        WeekStartsOn.sunday => 'Sunday',
        WeekStartsOn.monday => 'Monday',
      };
}

这种方法的缺点是需要手动覆盖所有需要适配的区域,容易遗漏,仅推荐在依赖极简的场景下使用。

内容的提问来源于stack exchange,提问作者Primordial_Hamster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:05:09