material.dart 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  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({Key key, this.child}) : super(key: key);
  7. @override
  8. _GameMaterialState createState() => _GameMaterialState();
  9. static ui.Image getMaterial(BuildContext context) {
  10. final _GameMaterialState state =
  11. context.ancestorStateOfType(const TypeMatcher<_GameMaterialState>());
  12. assert(state != null, "can not find GameMaterial widget");
  13. return state.material;
  14. }
  15. }
  16. class _GameMaterialState extends State<GameMaterial> {
  17. ///the image data of /assets/material.png
  18. ui.Image material;
  19. @override
  20. void initState() {
  21. super.initState();
  22. _doLoadMaterial();
  23. }
  24. void _doLoadMaterial() async {
  25. if (material != null) {
  26. return;
  27. }
  28. final bytes = await rootBundle.load("assets/material.png");
  29. final codec = await ui.instantiateImageCodec(bytes.buffer.asUint8List());
  30. final frame = await codec.getNextFrame();
  31. setState(() {
  32. material = frame.image;
  33. });
  34. }
  35. @override
  36. Widget build(BuildContext context) {
  37. return material == null ? Container() : widget.child;
  38. }
  39. }