flutter - 如何在 Flutter 的 initState 中获取当前的 App Local

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

这是我的代码:

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

导致此错误:

dependOnInheritedWidgetOfExactType<_LocalizationsScope>() or dependOnInheritedElement() was called before _HomePageState.initState() completed.

最佳答案

显然,您不能在 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();
  }

}

或者您可以简单地在此 Widget build() 中调用您的方法,因为所有方法都有效,仅在此处构建 Widget 之后

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

希望对您有所帮助。继续学习:)

关于flutter - 如何在 Flutter 的 initState 中获取当前的 App Locale?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62363577/

相关文章:

javascript - 为什么我的 JavaScript 在使用 Blazor 时不能正确呈现?

linux - tar: 目录: 无法 rmdir: 目录不为空

ios - 如何从 iOS (Swift) 连接到 MongoDB

c# - 使用 IIS 时出现多个错误

node.js - Node http.大文件传输失败并显示 'ERR_STREAM_PREMATU

python - `join` 或 `format` 字符串哪个更好?

python-3.x - pynput pip3 安装错误 : Could not find a v

python - 如何在 Excel 的 Power Query 中运行 Python 脚本

linux - docker 内部出现 fatal error : unable to access

javascript - react-router-dom 不工作只是渲染 "/"