Flutter中无BuildContext的普通类如何解决flutter_locales依赖context报错问题
问题根因
LocaleNotifier.of(context)是依赖Flutter组件树上下文的API,仅能在持有BuildContext的Widget层调用,普通业务Service类没有组件上下文对象,直接调用会报错。
可行解决方案
方案1:全局单例缓存语言状态
封装全局单例类,在应用初始化、语言切换的Widget层同步更新当前语言码,Service层直接读取单例值即可:
// 全局语言状态单例 class AppLocale { AppLocale._internal(); static final AppLocale instance = AppLocale._internal(); String currentLang = 'zh'; // 可设置项目默认语言 }
在根Widget的初始化逻辑中同步状态:
@override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { // 应用启动时同步当前语言 AppLocale.instance.currentLang = LocaleNotifier.of(context)!.locale!.languageCode; // 监听语言切换事件,实时更新单例值 LocaleNotifier.of(context)?.addListener(() { AppLocale.instance.currentLang = LocaleNotifier.of(context)!.locale!.languageCode; }); }); }
Service层调用示例:
class Service { var lang = AppLocale.instance.currentLang; }
方案2:直接读取本地存储和系统语言
flutter_locales会把用户选择的语言默认存在SharedPreferences的selected_locale键下,可直接读取该值,无需依赖上下文:
import 'package:shared_preferences/shared_preferences.dart'; import 'dart:io'; class Service { Future<String> getCurrentLang() async { final sp = await SharedPreferences.getInstance(); // 优先读用户选中的语言,不存在则返回系统当前语言码 return sp.getString('selected_locale') ?? Platform.localeName.split('_')[0]; } }
方案3:调用时传入语言参数
如果不想做全局缓存,可在Widget层调用Service方法时,把当前获取到的语言码作为参数传递:
// Service层改造 class Service { void doBusiness(String lang) { // 直接使用传入的语言码处理逻辑 } } // Widget层调用示例 final currentLang = LocaleNotifier.of(context)!.locale!.languageCode; Service().doBusiness(currentLang);
内容的提问来源于stack exchange,提问作者Mohammed Nabil
相关产品推荐
相关产品推荐

