import 'package:flutter/material.dart';
import 'package:image/image.dart' as imglib;
import 'dart:ui' as ui;
import 'package:flutter/services.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'IchooseApp',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({
super.key,
});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
final Future<List<Image>> listImages =
splitImage('assets/images/filmdirector.png');
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Image'),
),
body: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const SizedBox(
height: 16,
),
FutureBuilder(
future: listImages,
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
print('Snapshot data: ' + snapshot.data);
if (snapshot.hasData) {
return GridView.extent(
maxCrossAxisExtent: 150,
padding: const EdgeInsets.all(4),
mainAxisSpacing: 4,
crossAxisSpacing: 4,
children: List.generate(
snapshot.data!.length,
(i) => ListTile(
leading: snapshot.data?[i] ?? "got null",
)));
} else {
return Text('Nothing to say');
}
},
),
],
),
),
// This trailing comma makes auto-formatting nicer for build methods.
);
}
}
Future<List<ListTile>> _buildGridTileList(int count, listimg) async =>
List.generate(
count,
(i) => ListTile(
leading: listimg[i],
));
Future<List<Image>> splitImage(String path) async {
imglib.Image? image = await decodeAsset(path);
List<Image> pieces = [];
int x = 0, y = 0;
int width = (image!.width / 3).floor();
int height = (image.height / 3).floor();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
imglib.Image croppedImage =
imglib.copyCrop(image, x: x, y: y, width: width, height: height);
pieces.add(Image.memory(imglib.encodeJpg(croppedImage)));
x += width;
}
x = 0;
y += height;
}
return pieces;
}
Future<imglib.Image?> decodeAsset(String path) async {
final data = await rootBundle.load(path);
// Utilize flutter's built-in decoder to decode asset images as it will be
// faster than the dart decoder.
final buffer =
await ui.ImmutableBuffer.fromUint8List(data.buffer.asUint8List());
final id = await ui.ImageDescriptor.encoded(buffer);
final codec =
await id.instantiateCodec(targetHeight: id.height, targetWidth: id.width);
final fi = await codec.getNextFrame();
final uiImage = fi.image;
final uiBytes = await uiImage.toByteData();
final image = imglib.Image.fromBytes(
width: id.width,
height: id.height,
bytes: uiBytes!.buffer,
numChannels: 4);
return image;
}
Future<imglib.Image?> decodeAsset(String path) async {
final data = await rootBundle.load(path);
// Utilize flutter's built-in decoder to decode asset images as it will be
// faster than the dart decoder.
final buffer =
await ui.ImmutableBuffer.fromUint8List(data.buffer.asUint8List());
final id = await ui.ImageDescriptor.encoded(buffer);
final codec =
await id.instantiateCodec(targetHeight: id.height, targetWidth: id.width);
final fi = await codec.getNextFrame();
final uiImage = fi.image;
final uiBytes = await uiImage.toByteData();
final image = imglib.Image.fromBytes(
width: id.width,
height: id.height,
bytes: uiBytes!.buffer,
numChannels: 4);
return image;
}
Trying to build a grid view from Future<List> using Future Builder.
But i am getting this error.
error is as shown in image
Any help would be really appreciated.
I am actually trying to build an image swap game.
Lorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem Ipsum