如何在 Flutter 的 initState 中获取当前的应用程序区域设置?

Meh*_*udi 6 flutter

我需要根据当前应用程序区域设置使用提供程序在 initState 方法中获取数据。

这是我的代码:

  initState() {
    super.initState();
    Locale myLocale = Localizations.localeOf(context);
    context.read<ApiProvider>().getHomeData(myLocale.languageCode);
  }
Run Code Online (Sandbox Code Playgroud)

导致此错误:

在 _HomePageState.initState() 完成之前调用 dependentOnInheritedWidgetOfExactType<_LocalizationsScope>() 或 dependentOnInheritedElement()。

Alo*_*lok 0

显然,您无法在 initState 期间访问current App Locale(更具体地说:在完成之前)。

我认为原因是Locale尝试在树中查找 InheritedWidget 祖先,但树刚刚正在构建(您的小部件是在父小部件的构建期间创建的)

  • 当小部件正在构建时,尽量不要执行该操作。保留检查
  • 有一个变量来检查小部件何时构建,然后您可以调用它
class _HomePageState extends State<Test> {

  bool isInitialized = false;

  @override
  void initState() {
    super.initState();
  }

  void _initializeLocale(BuildContext context){
     Locale myLocale = Localizations.localeOf(context);
     context.read<ApiProvider>().getHomeData(myLocale.languageCode);
  }

  @override
  Widget build(BuildContext context) {
    // Setting the initialize to true, when widget is built
    // to perform our operation
    setState(() {
      isInitialized = true;

      // calling our method when it is ready and initialized
      _initializeLocale(context);
    });
   return Scaffold();
  }

}
Run Code Online (Sandbox Code Playgroud)

或者您可以简单地在 this 中调用您的方法Widget build(),因为只有在此处构建小部件之后,所有方法才有效

@override
Widget build(BuildContext context) {
  // simply call your method here, no initialize variable required
  _initializeLocale(context);
  return Scaffold();
}
Run Code Online (Sandbox Code Playgroud)

希望有帮助。保持学习 :)