使变量更新时使用三元运算符更新绘制的小部件

Make widget drawn with ternary operator update when variable updates

我的 flutter 项目中有一个 container,它加载由 flutter image_picker 包编辑的图像 select。如果该值为 null,它会加载占位符图像和说明上传图像的文本。

GestureDetector(
                  onTap: () async {
                    setState(() {
                      _pickImage();
                    });
                  },
                  child: photo != null
                      ? Image.file(
                          File(
                            photo!.path.toString(),
                          ),
                        )
                      : Container(
                          decoration: BoxDecoration(
                            borderRadius: BorderRadius.circular(15),
                            color: const Color(0xff303434),
                          ),
                          height: 200,
                          width: double.infinity,
                          child: Center(
                            child: Column(
                              mainAxisAlignment: MainAxisAlignment.center,
                              children: [
                                Image.asset('assets/images/camera.png'),
                                Text(
                                  'Upload Image',
                                  style: GoogleFonts.poppins(
                                    color: Colors.white,
                                    fontSize: 15,
                                  ),
                                ),
                              ],
                            ),
                          ),
                        ),
                ),

选取图片的函数为:

void _pickImage() async {
      setState(() async {
        final ImagePicker _picker = ImagePicker();
        photo = await _picker.pickImage(
          source: ImageSource.camera,
          imageQuality: 90,
        );
        if (photo == null) return;
      });
    }

问题是,当我select一个图像时,它只会在我热重新加载我的项目时显示在容器中,如果我之后选择另一个图像,我需要热重启来更新图像在容器中。如何解决此问题并使容器中的图像在我 select 和图像时自动上传,而不是必须热重启?

您需要将所有代码移出 setState,并移除 async。

将所有内容移出 setState 并在其后调用 set state,其中没有任何内容,而不是异步 :D