Flutter:如何在枚举中使用MaterialLocalizations获取区域默认值?
解决方案
方法一:使用intl包(推荐,无需Context且覆盖所有区域规则)
- 首先在
pubspec.yaml中添加intl依赖:
dependencies: intl: ^0.19.0 # 可替换为最新版本
- 修改枚举的
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
相关产品推荐
相关产品推荐

