dart flutter visitChildElements()在构建期间调用

xpcnnkqh  于 2023-09-28  发布在  Flutter
关注(0)|答案(5)|浏览(342)

我试图创建一个下载功能,从URL下载文件到手机存储,我做了一个小部件来显示,如果下载开始,也要使用进度计数器显示getx obs

final ApiServiceController uController = Get.put(ApiServiceController());

downloading(String fileUrl, String fileName) async {
    Dio dio = Dio();
    fToast("Downloading... $fileName", pop);

    try {
      var dir = await downloadDirectory();
      uController.isDwd.value = true;

      await dio.download(fileUrl, "${dir.path}/$fileName",
          onReceiveProgress: (rec, total) {
        print("Rec: $rec , Total: $total");

        uController.dwdP.value = ((rec / total) * 100).toStringAsFixed(0) + "%";
      });
      fToast("Downloaded", pop);
    } catch (e) {
      print(e);
    }
    uController.isDwd.value = false;

    print("Download completed");
  }

要显示的控件

Stack(children: [
///.. Container widget here,
Obx(() {
    return uController.isDwd.value
        ? loading(context, uController.dwdP.value)
        : SizedBox(height: 0);
  })
])

但每当我点击下载按钮开始下载它抛出错误

════════ Exception caught by widgets library ═══════════════════════════════════
The following assertion was thrown building Obx(has builder, dirty, state: _ObxState#291e4):
visitChildElements() called during build.

The BuildContext.visitChildElements() method can't be called during build because the child list is still being updated at that point, so the children might not be constructed yet, or might be old children that are going to be replaced.
The relevant error-causing widget was
Obx

错误将显示在屏幕上,直到下载完成。我看到用这个就能修好

WidgetsBinding.instance.addPostFrameCallback((_) {
      // executes after build
});

但我不知道在这种情况下如何使用它。请有一种方法来解决这个问题,如果你需要更多的解释或信息,请告诉我

w8ntj3qf

w8ntj3qf1#

你的代码看起来很好。我认为你应该在GitHub上的GetX上创建一个问题。

hfsqlsce

hfsqlsce2#

在我的例子中,我错误地在ReadyMethod上的控制器上&在小部件构建方法中更改了两次可观察变量

bvn4nwqk

bvn4nwqk3#

我认为这个问题是由使用一个obs变量内的子部件,它的父部件也包括相同或以某种方式相同的obs变量或有一个状态操作的子部件,这是有关父部件的.你最好提供更多的UI代码,以使明确的子部件的细节,但我的猜测是,你正在做一些操作与上下文,你给加载小部件和操作的原因,在上下文中的UI构建和更改,如果不是请提供更详细的代码.

xwbd5t1u

xwbd5t1u4#

在我的例子中,我错误地修改了observable变量两次,一次是在on select & widget构建方法中。
然后我评论了其中一个,它开始工作。
这可能也适用于你,试试吧。
谢谢.

xa9qqrwz

xa9qqrwz5#

public int findDuplicate(int findDuplicate);

相关问题