【问题标题】:Flutter initState does not run the method calledFlutter initState 不运行调用的方法
【发布时间】:2021-11-14 20:57:10
【问题描述】:

我确定我遗漏了一些非常明显的东西,但是我无法理解为什么会发生这种情况。

我调用了一个名为 readJSON 的方法,它将 JSON 文件读入对象。我使用长度来呈现页面,每个页面都有一个基于主对象索引的复选框列表。

我已使用:https://github.com/afzalali15/onboarding_demo 在我的应用程序中构建此入职任务。

*请注意,当我实现这个时,我看到热重载工作得非常好。当我关闭 VSCode 并稍后再次打开时,readJSON 方法永远不会运行。

class _OnboardingPageState extends State<OnboardingPage> {
  List<OnboardingTodo> onboardingTasks = [];
  final _controller = OnboardingController();
  String response = '';

  bool value = false;

  Future<void> readJson() async {
    response = await rootBundle.loadString('assets/cfg/onboarding_tasks.json');
    final onboardingTodo = onboardingTodoFromJson(response);
    onboardingTasks.addAll(onboardingTodo.values);
    print("onboarding length - " + onboardingTasks.length.toString());
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Stack(
          children: [
            PageView.builder(
              controller: _controller.pageController,
              onPageChanged: _controller.selectedPageIndex,
              itemCount: onboardingTasks.length,
              itemBuilder: (context, index) {
                return Container(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Image.asset(
                        _controller.onboardingPages[index].imageAsset,
                        height: 100,
                        width: 100,
                      ),
                      SizedBox(height: 32),
                      Text(
                        _controller.onboardingPages[index].title,
                        style: TextStyle(
                            fontSize: 24, fontWeight: FontWeight.w500),
                      ),
                      SizedBox(height: 32),
                      Expanded(
                        child: Container(
                          child: ListView.builder(
                            padding: const EdgeInsets.all(8),
                            itemCount: onboardingTasks[index].tasks.length,
                            itemBuilder:
                                (BuildContext context, int chkBoxindex) {
                              return CheckboxListTile(
                                controlAffinity:
                                    ListTileControlAffinity.leading,
                                value: value,
                                title: Text(
                                    '${onboardingTasks[index].tasks[chkBoxindex].title}'),
                                onChanged: (bool newVal) {
                                  setState(() {
                                    value = newVal;
                                  });
                                },
                              );
                            },
                          ),
                        ),
                      ),
                    ],
                  ),
                );
              },
            ),
            // The dots showing the index of the pages
            ...
            // The next/end button
            ...
          ],
        ),
      ),
    );
  }
}

感谢任何帮助或建议。谢谢

【问题讨论】:

  • 我检查了以下内容:stackoverflow.com/questions/60082129/… 但我无法得到答案
  • 如果readJson什么都不返回,你如何得到null,请显示错误
  • 对不起,我把标题改了一点。所以该方法不执行。所以我使用的任何东西都是空的。
  • 你应该在函数调用中使用“等待”吗?等待 readJson();
  • 返回错误

标签: flutter dart listview


【解决方案1】:

试试void initState() { super.initState(); WidgetsBinding.instance .addPostFrameCallback((_) =&gt; readJson();); } 或使用 Loader 之类的

bool loading = true;
  Future<void> readJson() async {
    setState(() => loading = true);
    response = await rootBundle.loadString('assets/cfg/onboarding_tasks.json');
    final onboardingTodo = onboardingTodoFromJson(response);
    onboardingTasks.addAll(onboardingTodo.values);
    print("onboarding length - " + onboardingTasks.length.toString());
    setState(() => loading = false);
  }

并将加载器放入 UI 中

itemBuilder: (context, index) {
                return loading ? YourProgressIndicatorWidget : Container(child: ......
}

【讨论】:

  • 这太接近了,在我按照您的建议添加进度指示器后,它现在停止崩溃了。但是,现在屏幕变黑了。需要在 VSCode 上点击保存,然后一切都会刷新并且数据已打开。
  • 刚看到这个错误:flutter: No observables detected in the build method of Observer
  • 不太明白,试试把bool loading = false;改成bool loading = true;,把setStatereadJson()换成loading = ...
  • 你能分享更多关于错误的信息吗?
  • 是的,如果您想在设备上保存数据,您可以。如果您在使用中遇到困难,请创建一个新问题,您一定会得到帮助
猜你喜欢
  • 2020-07-15
  • 1970-01-01
  • 2019-08-30
  • 2021-10-28
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 2018-09-02
  • 2020-09-27
相关资源
最近更新 更多