sky_box
A sky box package for flutter.
Example Sky boxes by Emil Persson, aka Humus. Their work is licensed under a Creative Commons Attribution 3.0 Unported License.
Introduction
A sky box is a cube with 6 textures on the inside. The cube is constructed around the view point and warped to look like a sphere.
Each texture is a dart:ui Image object. 6 images are required, one for both positive and negative x, y and z axis.
Axis | Image |
---|---|
+x | right |
-x | left |
+y | top |
-y | bottom |
+z | front |
-z | back |
Usage
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: Scaffold(
body: FutureBuilder<List<ui.Image>>(
/// Load all images in parallel.
future: Future.wait([
_image('images/top.png'),
_image('images/front.png'),
_image('images/right.png'),
_image('images/left.png'),
_image('images/bottom.png'),
_image('images/back.png')
]),
builder: (context, snapshot) {
if (snapshot.hasData) {
/// Pass images to sky box.
return Stack(
children: [
/// Full screen sky box.
Positioned.fill(
/// Use sky box widget.
child: SkyBox(
top: snapshot.data![0],
front: snapshot.data![1],
right: snapshot.data![2],
left: snapshot.data![3],
bottom: snapshot.data![4],
back: snapshot.data![5],
),
),
],
);
}
/// Show loading indicator while images are loading.
return const Center(child: CircularProgressIndicator());
},
),
),
);
}
Future<ui.Image> _image(String path) {
/// Load image from assets.
return rootBundle.load(path).then((bytes) {
return ui.instantiateImageCodec(bytes.buffer.asUint8List()).then((codec) {
return codec.getNextFrame().then((frame) {
return frame.image;
});
});
});
}
}