#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;
}