【问题标题】:Why I use setState in async funtion not update state (Flutter)?为什么我在异步函数中使用 setState 而不是更新状态(Flutter)?
【发布时间】:2019-11-16 10:05:00
【问题描述】:

为什么我的 _image 没有更新?

当用户从图库或相机中选择新图像时,我需要 _image 属性更新,但是当用户选择新图像时,我使用 setState 将新值设置为 _image 但它没有'不起作用(没有更新 UI)。

我的代码有问题: 抱歉,我无法完整源代码,因为 stackoverflow 的编辑器向许多代码抱怨。

有状态类: 枚举 ChooseMedia { 相机、画廊 }

  File _image;

  void getImage(ChooseMedia media) async {
    if (media == ChooseMedia.camera) {
      var image = await ImagePicker.pickImage(source: ImageSource.camera);
      var pathLocal = await getApplicationDocumentsDirectory();
      await image.copy('${pathLocal.path}/profileImage.jpg').then((_) {
        setState(() {
          _image = image;
        });
      });
    }
    if (ChooseMedia.gallery == media) {
      var image = await ImagePicker.pickImage(source: ImageSource.gallery);
      var pathLocal = await getApplicationDocumentsDirectory();

      await image.copy('${pathLocal.path}/profileImage.jpg').then((_) {
        setState(() {
          _image = image;
        });
      });
    }
  }



  @override
  Widget build(BuildContext context) {

        return PopupMenuButton(
          elevation: 5,
          shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.all(Radius.circular(15))),
          onSelected: (ChooseMedia media) {
            getImage(media);
          },
          itemBuilder: (BuildContext context) => <PopupMenuEntry<ChooseMedia>>[
            const PopupMenuItem<ChooseMedia>(
              value: ChooseMedia.gallery,
              child: ListTile(
                leading: Icon(
                  Icons.picture_in_picture,
                ),
                title: Text('From galaxy'),
              ),
            ),
            const PopupMenuItem<ChooseMedia>(
              value: ChooseMedia.camera,
              child: ListTile(
                leading: Icon(Icons.camera),
                title: Text('Take picture'),
              ),
            ),
          ],
          child: Container(
              decoration: BoxDecoration(),
              padding: EdgeInsets.all(7),
              child: CircleAvatar(
                  backgroundImage: _image == null
                      ? AssetImage('assets/images/profile.jpg')
                      : FileImage(_image))),
        );
  }

【问题讨论】:

  • 您的文件是否被复制到您提供的位置?控制台日志说什么?

标签: flutter dart setstate


【解决方案1】:

您正在混合“等待”和“然后” 做吧

var copiedImage = await image.copy('${pathLocal.path}/profileImage.jpg');
setState(() {
    _image = copiedImage;
});

【讨论】:

  • 我像你一样保存但它不起作用,它只是第一次工作,第二次选择它不更新的图像:var image = await ImagePicker.pickImage(source: ImageSource.gallery); var pathLocal = await getApplicationDocumentsDirectory(); var saveFile = await image.copy('${pathLocal.path}/profileImage.jpg'); setState(() { image = saveFile; });
  • 那是因为图片路径总是一样的做这样的事情 var pathLocal = await getApplicationDocumentsDirectory(); if (_image != null) { _image.deleteSync(); } setState(() { _image = null; }); var image = await ImagePicker.pickImage(source: ImageSource.camera); var copyImage = await image.copy('${pathLocal.path}/${DateTime.now()}.jpg'); setState(() { _image =copyedImage; });
猜你喜欢
  • 1970-01-01
  • 2020-10-28
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 2019-01-05
  • 2017-02-01
相关资源
最近更新 更多