当前位置: 首页 > 知识库问答 >
问题:

颤振在不等待代码执行的情况下重建小部件

勾渝
2023-03-14

我有一个上传图像到服务器的功能。然而,小部件在上传图像时开始重建,并且在上传图像后不执行代码。

InkWell(
  child: Icon(
    Icons.camera,
    size: 50,
    color: Colors.red[400],
  ),
  onTap: () {
    _imageFile =
        _picker.getImage(source: ImageSource.camera);
    _imageFile.then((file) async {
      if (file != null) {
        fileName = file.path.toString();
        var res = await Auth.uploadImage(file);
        print("Response for image upload is : ");
        print(res);
        await setUserData();
      }
    });
  },
)

这是控制台上打印语句的输出

I/flutter (10171): Calling build Method
I/Timeline(10171): Timeline: Activity_launch_request time:68831133
I/flutter (10171): Uploading image to server
I/flutter (10171): Calling build Method
I/flutter (10171): Image uploaded successfully

如上所述,没有执行任何其他代码,小部件已经重建了自身。我可能做错了什么?

共有2个答案

孙子民
2023-03-14
匿名用户

这是因为当您使用_imageFile=_picker.getImage(来源:ImageSource.camera);_imageFile结果将在未来出现,您的下一段代码将被执行

您可以使用await解决此问题:

 onTap: () async {
    _imageFile =
        await _picker.getImage(source: ImageSource.camera);
    if (_imageFile != null) {
        fileName = file.path.toString();
        var res = await Auth.uploadImage(file);
        print("Response for image upload is : ");
        print(res);
        await setUserData();
    }
  },

或者继续使用,然后稍作更改:

  onTap: () {
    _picker.getImage(source: ImageSource.camera)
           .then((file) async {
             if (file != null) {
               fileName = file.path.toString();
               var res = await Auth.uploadImage(file);
               print("Response for image upload is : ");
               print(res);
               await setUserData();
           }
        });
  },

请参阅关于wait的说明

孟俊发
2023-03-14

\u imageFile=\u picker。getImage(来源:ImageSource.camera)这是不对的,getImage是一个异步函数,所以需要等待它完成。

执行此操作-_imageFile=等待_picker.get图像(来源:ImageSource.camera);

如果你想使用,那么像这样做,\u picker。getImage(来源:ImageSource.camera)。然后((图像)。。。你的代码…)

 类似资料:
  • 在下面的代码中。有两个倒计时(黄色和红色),当条件改变时,显示屏上显示的倒计时控件将改变,即从黄色切换到红色,反之亦然。 然而,当它切换时,倒计时变为“重新初始化”。例如,假设黄色的初始计时器为60秒,在滴答40秒后,它会下降到剩下20秒。此时,条件改变两次,例如5秒,因此倒数计时器切换为红色并返回黄色。不是从15秒开始计时,而是从60秒开始重新启动。如何防止小部件的这种“重新初始化”,并允许计时

  • 目前我正在尝试颤振网页,我需要在颤振主频道工作。但是,后来我需要继续我的其他项目。在他们身上,我正在研究颤振稳定通道。 但是,每当我使用命令“flutter channel stable”或“fluter channel master”切换我的flutter通道时,它每次都会重新下载sdk和其他工具。 目前,我已经下载了稳定的颤振sdk和稳定的dart sdk。 我已将它们移动到“FlutterS

  • 我一直在做一个倒计时程序,我想到了这个。 在最后的while循环中,如果里面没有print/println语句,倒计时代码就不会执行。为什么?不过,该程序与print语句配合得非常好。

  • Java/Selenium WebDriver/Firefox 页面上有一个文本“输入”字段。然后它下面有一个‘提交’按钮。加载页面时,输入字段和提交按钮都已启用。在输入字段中输入文本后,是否有一种方法让WebDriver在点击Submit按钮之前等待“x”秒,而不是立即点击它。

  • 问题内容: 我是Java的新手,我只是在寻求一点帮助。 我试图创建一个程序,允许用户输入gui的名称和>>百货商店的位置。它允许这样做,但是程序不等待输入> details,它只是初始化Gui类,并简单地继续执行> processing,这是将输入Gui的细节添加到数组列表中。但是尚未输入> details,因此它正在创建一个空值,因为它已经向前跳了。 那么如何使它停止并等待直到输入值然后提交呢?

  • 我很熟悉flutter中的无状态和有状态小部件,但我很好奇为什么我们不将有状态小部件定义为无状态小部件?为什么我们需要声明两个不同的类,一个用于createstate方法,一个用于实际的状态实现?