Как отобразить будущее изображение с поставщиком изображений в флаттере

Я создаю экран редактирования, где пользователь может изменить изображение. Я хотел бы, чтобы пользователь отображал одно из трех изображений: - изображение с сервера - временное изображение, если оно ранее не было загружено - новое изображение для загрузки.

Проблема возникает, когда я собираюсь отображать изображение с сервера. С помощью Future Builder можно отображать изображение, но нельзя загрузить новое изображение. Если я не использую Future Builder, я получаю сообщение об ошибке

будущее не является подтипом типа ImageProvider

Моя аватарка для показа изображений

                            CircleAvatar(
                        radius: MediaQuery.of(context).size.width / 6,
                        backgroundColor: Colors.grey,
                        backgroundImage: getImage(),
                      ),

получить изображение()

      getImage() {
    if (_image != null) {
      if (uploadCounter == 0) {
        uploadImage();
        AlertDialog(
          shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.all(Radius.circular(20.0))),
          backgroundColor: Colors.lightBlue[900],
          content: Container(
            child: Text('Uploading...'),
          ),
        );
      }
      return FileImage(_image);
    } else {
      return _emptyImage;
    }
  }

и мое загружаемое изображение

      uploadImage() async {
    if (_image == null) {
      showAlertDialog(
          context: context,
          title: "Error Uploading!",
          content: "No Image was selected.");
      return;
    } else {
      setState(() {
        uploadStatus = true;
      });

      final preffs = await SharedPreferences.getInstance();
      final token = preffs.getString('token');
      final id = preffs.getString('id');
      var uri = Uri.parse('http://10.0.2.2:8000/profiles/update/');
      var request = http.MultipartRequest('PUT', uri)
        ..fields['id'] = id
        ..headers.addAll({"Authorization": token})
        ..files.add(await http.MultipartFile.fromPath('image_1', _image.path));
      var response = await request.send();
      if (response.statusCode == 200) {
        print('Uploaded!');
        print(response);
      }
      setState(
        () {
          uploadStatus = false;
          uploadCounter = 1;
        },
      );
    }
  }

Я пытался получить изображение с сервера через будущий конструктор или сохранить изображение перед входом на этот экран, а затем перезагрузить его из файла, но сохранение файлов во флаттере - не лучшее решение, я думаю

1 ответ

Единственное решение, которое работает на данный момент, выглядит так.

      FutureBuilder<Profile>(
                      future: profileService.getProfile(),
                      builder: (context, snapshot) {
                        if (snapshot.hasData) {
                          profile = snapshot.data;
                          return CircleAvatar(
                            radius: MediaQuery.of(context).size.width / 6,
                            backgroundColor: Colors.grey,
                            backgroundImage: Image.network(
                                    "http://10.0.2.2:8000/" +
                                        profile.image_1.toString())
                                .image,
                          );
                        } else {
                          return Container();
                        }
                      }),
                  CircleAvatar(
                    radius: 0.1,
                    backgroundColor: Colors.grey,
                    backgroundImage: getImage(),
                  ),

Если я поставлю второй CircleAvatar взамен if-else, у меня возникнут некоторые проблемы. Например, нет фотографии, просто серое изображение и т. Д., Проблема с загрузкой фотографии.

Другие вопросы по тегам