material.dart 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import 'dart:ui' as ui;
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/services.dart';
  4. class GameMaterial extends StatefulWidget {
  5. final Widget child;
  6. const GameMaterial({
  7. Key? key,
  8. required this.child,
  9. }) : super(key: key);
  10. @override
  11. State<GameMaterial> createState() => _GameMaterialState();
  12. static ui.Image getMaterial(BuildContext context) {
  13. final state = context.findAncestorStateOfType<_GameMaterialState>();
  14. assert(state != null, "can not find GameMaterial widget");
  15. return state!.material!;
  16. }
  17. }
  18. class _GameMaterialState extends State<GameMaterial> {
  19. ///the image data of /assets/material.png
  20. ui.Image? material;
  21. @override
  22. void initState() {
  23. super.initState();
  24. _doLoadMaterial();
  25. }
  26. void _doLoadMaterial() async {
  27. if (material != null) {
  28. return;
  29. }
  30. final bytes = await rootBundle.load("assets/material.png");
  31. final codec = await ui.instantiateImageCodec(bytes.buffer.asUint8List());
  32. final frame = await codec.getNextFrame();
  33. setState(() {
  34. material = frame.image;
  35. });
  36. }
  37. @override
  38. Widget build(BuildContext context) {
  39. return material == null ? Container() : widget.child;
  40. }
  41. }