Flutter: тип ‘Future’ не является подтипом типа ‘Uint8List’

#android #flutter

#Android #флаттер

Вопрос:

Мне нужно отобразить изображение предварительного просмотра в ListTile, я использую Uint8List. Вот мой код в ListTile, который получает данные Uint8List:

                   ConstrainedBox(
                    constraints: BoxConstraints(
                      minWidth: 44,
                      minHeight: 44,
                      maxWidth: 64,
                      maxHeight: 64,
                    ),
                    child: Image.memory(loadAsset(paths[position].fileName)),
                  ) 
  

Тот самый фрагмент кода, который получает Uint8List:

   loadAsset(name) async {
    Uint8List data = (await clientNextCloud.preview.getPreview(name, 10, 10))
        .buffer
        .asUint8List();
    setState(() {});
    return data;
  }
  

await clientNextCloud.preview.getPreview(name, 10, 10) — Эта часть получает Uint8List из пакета nextcloud dart.

Я получаю следующую ошибку — type 'Future<dynamic>' is not a subtype of type 'Uint8List' Может кто-нибудь сказать мне, в чем проблема? Спасибо!

Ответ №1:

Проблема в том, что ваш loadAsset является асинхронным методом, что означает, что он вернет Future<T> . Вы не можете изменить это, поскольку getPreview также является асинхронным.

Чтобы исправить это, вам нужно адаптировать свой пользовательский интерфейс для отображения чего-либо, пока метод async не завершен. Для достижения этого вы можете использовать FutureBuilder.

Комментарии:

1. child: FutureBuilder( future: listFiles(clientNextCloud), builder: (context, snapshot) { return snapshot.data != null ? listViewWidget(snapshot.data) : Center(child: CircularProgressIndicator()); } ), Да, я использую FutureBuilder)

2. Большое вам спасибо, благодаря вам я просто добавил еще одну строку с предварительным просмотром в свою модель и добавил значение в список объектов, а затем взял значения оттуда, большое вам спасибо за то, что правильно меня направили, не совсем то, что сказал yt, но вы помогли мне!!!!

Ответ №2:

Попробуйте использовать следующий подход —

 loadAsset(paths[position].fileName).then((value) => {
               Image.memory(value),               
});
  

Метод loadAsset возвращает значение Future.

Комментарии:

1. type 'Future<dynamic>' is not a subtype of type 'Widget' 🙁