Я хочу загрузить и отобразить несколько изображений из папки в Windows, группируя их по размеру (например, большие, средние, значки и т. Д.).
В Чтобы узнать их размер перед их отображением, я зацикливаю список с помощью функции decodeImage
из 'package:image/image.dart'
для каждого изображения.
Чего я хочу добиться, так это чтобы изображения появлялись на экране после каждой итерации, без блокировки пользовательского интерфейса, пока весь процесс загрузки не будет завершен.
У меня есть список моделей изображений, и я звоню setState
, как только я добавляю каждое изображение в список, чтобы обновить представление, но все изображения отображаются в конце l oop.
Как это исправить?
Это вывод консоли отладки (для всех изображений требуется около 10 секунд чтобы появиться):
C:\flutter\flutter-desktop-embedding\example>flutter run
Launching lib\main.dart on Windows in debug mode...
Building Windows application...
flutter: 2020-01-12 16:00:12.604871
flutter: 2020-01-12 16:00:13.160340
flutter: 2020-01-12 16:00:13.656014
Syncing files to device Windows...
flutter: 2020-01-12 16:00:14.050997
flutter: 2020-01-12 16:00:14.561593
flutter: 2020-01-12 16:00:15.040311
flutter: 2020-01-12 16:00:15.502076
flutter: 2020-01-12 16:00:15.936912
flutter: 2020-01-12 16:00:16.404174
flutter: 2020-01-12 16:00:16.919285
flutter: 2020-01-12 16:00:17.481826
flutter: 2020-01-12 16:00:17.941551
flutter: 2020-01-12 16:00:18.400322
flutter: 2020-01-12 16:00:18.864382
flutter: 2020-01-12 16:00:19.297922
flutter: 2020-01-12 16:00:19.745731
flutter: 2020-01-12 16:00:20.218457
flutter: 2020-01-12 16:00:20.654293
flutter: 2020-01-12 16:00:21.120047
flutter: 2020-01-12 16:00:21.629715
Syncing files to device Windows... 13.892ms (!)
И это код (здесь я использовал одно изображение JPG 1920x1080):
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:image/image.dart' as dart_image;
void main() {
// See https://github.com/flutter/flutter/wiki/Desktop-shells#target-platform-override
debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;
runApp(new MyApp());
}
class ImageModel {
final File file;
final double height;
final double width;
ImageModel(this.file, {this.width, this.height});
}
class MyApp extends StatefulWidget {
MyApp();
@override
State<StatefulWidget> createState() {
return MyAppState();
}
}
class MyAppState extends State<MyApp> {
List<ImageModel> imageModelList = [];
@override
void initState() {
super.initState();
imageModelList = [];
_loadImages();
}
void _loadImages() {
final imagePaths = List.filled(20, 'C:/flutter/test/elephant.jpg');
for (final imagePath in imagePaths) {
final file = File(imagePath);
file.readAsBytes().then((bytes) {
final image = dart_image.decodeImage(bytes);
// Here i should read the size to group the images based on their size.
// For now i just add images with 1920x1080 size.
if (image != null && image.width == 1920 && image.height == 1080) {
final width = image.width.toDouble();
final height = image.height.toDouble();
final imageModel = ImageModel(file, width: width, height: height);
print(DateTime.now());
setState(() => imageModelList.add(imageModel));
}
}).catchError((err) {});
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(
title: Text('title'),
),
body: SingleChildScrollView(
child: Wrap(
children: imageModelList.map((imageModel) {
return new Container(
child: Image.file(
imageModel.file,
width: 160,
filterQuality: FilterQuality.medium,
),
);
}).toList(),
),
),
),
title: 'title',
);
}
}