В Flutter, как использовать нулевую безопасность в будущем?

#flutter #future #dart-null-safety

Вопрос:

Я пытаюсь перейти на нулевую безопасность в Flutter. Следующий фрагмент кода для преобразования ImageProvider в ByteData отлично работает без нулевой безопасности.

 static Future<ByteData> imgProvider2ByteData(ImageProvider img) async {
Completer<ByteData> completer = new Completer<ByteData>();
img
    .resolve(new ImageConfiguration())
    .addListener(ImageStreamListener((ImageInfo info, bool _) {
      completer.complete(info.image.toByteData(format: ui.ImageByteFormat.png));
}));
return completer.future;
 

}

 ///pass ImageProvider to above function 

ImageProvider provider=....

imgProvider2ByteData(provider).then((val) {
        var data = val.buffer.asUint8List();
 });
 

После включения нулевой безопасности функция toByteData возвращает будущее<ByteData?>, поэтому я внес следующие изменения (добавив ? по типу и ! о будущей возвращаемой стоимости):

 static Future<ByteData?> imgProvider2ByteData(ImageProvider img) async {
Completer<ByteData?> completer = new Completer<ByteData>();
img
    .resolve(new ImageConfiguration())
    .addListener(ImageStreamListener((ImageInfo info, bool _) {
      completer.complete(info.image.toByteData(format: ui.ImageByteFormat.png));
}));
return completer.future;
 

}

     /*pass ImageProvider to above function */

ImageProvider provider=....

imgProvider2ByteData(provider).then((val) {
        var data = val!.buffer.asUint8List();
 });
 

Когда я запускаю его, я получаю следующую ошибку:

Исключение, обнаруженное службой ресурсов изображений типа » Будущее<ByteData?>», не является подтипом типа «Будущее» или «значение».

Должно быть, я сделал что-то не так, но не могу понять, как использовать нулевую безопасность для будущего возвращаемого значения. Буду признателен за любую помощь.

Ответ №1:

Поскольку toByteData() возвращает a Future<ByteData?> , вы также должны вернуть то же самое из своего метода. Попробуйте это:

 Future<ByteData?> imgProvider2ByteData(ImageProvider img) async {
  var completer = Completer<ByteData?>();
  img.resolve(ImageConfiguration()).addListener(ImageStreamListener((ImageInfo info, bool _) {
    completer.complete(info.image.toByteData());
  }));
  return completer.future;
}