diff --git a/CHANGELOG.md b/CHANGELOG.md index 454a9e74c..6523dedbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## [next] - Updated the doc structure and minor language fixes +- Adding AssetsCache.readBinaryFile ## 0.20.2 - Fix text component bug with anchor being applied twice diff --git a/docs/examples/animations/.gitignore b/docs/examples/animations/.gitignore index 07488ba61..58f685d7f 100644 --- a/docs/examples/animations/.gitignore +++ b/docs/examples/animations/.gitignore @@ -68,3 +68,8 @@ !**/ios/**/default.pbxuser !**/ios/**/default.perspectivev3 !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages + +lib/generated_plugin_registrant.dart +macos/ +test/ +web/ diff --git a/docs/examples/aseprite/lib/main.dart b/docs/examples/aseprite/lib/main.dart index 7dc038c29..df7d9434c 100644 --- a/docs/examples/aseprite/lib/main.dart +++ b/docs/examples/aseprite/lib/main.dart @@ -5,6 +5,7 @@ import 'package:flame/components/animation_component.dart'; import 'package:flutter/material.dart'; void main() async { + WidgetsFlutterBinding.ensureInitialized(); final Size size = await Flame.util.initialDimensions(); runApp(MyGame(size).widget); } diff --git a/lib/assets_cache.dart b/lib/assets_cache.dart index 393320ff0..156ad4486 100644 --- a/lib/assets_cache.dart +++ b/lib/assets_cache.dart @@ -1,31 +1,61 @@ import 'package:flutter/services.dart' show rootBundle; +import 'dart:typed_data'; /// A class that loads, and cache files /// /// it automatically looks for files on the assets folder class AssetsCache { - Map textFiles = {}; + final Map _files = {}; /// Removes the file from the cache void clear(String file) { - textFiles.remove(file); + _files.remove(file); } /// Removes all the files from the cache void clearCache() { - textFiles.clear(); + _files.clear(); } /// Reads a file from assets folder Future readFile(String fileName) async { - if (!textFiles.containsKey(fileName)) { - textFiles[fileName] = await _readFile(fileName); + if (!_files.containsKey(fileName)) { + _files[fileName] = await _readFile(fileName); } - return textFiles[fileName]; + assert(_files[fileName] is _StringAsset, '"${fileName}" is not a String Asset'); + + return _files[fileName].value; } - Future _readFile(String fileName) async { - return await rootBundle.loadString('assets/$fileName'); + /// Reads a binary file from assets folder + Future> readBinaryFile(String fileName) async { + if (!_files.containsKey(fileName)) { + _files[fileName] = await _readBinary(fileName); + } + + assert(_files[fileName] is _BinaryAsset, '"${fileName}" is not a Binary Asset'); + + return _files[fileName].value; + } + + Future<_StringAsset> _readFile(String fileName) async { + final string = await rootBundle.loadString('assets/$fileName'); + return _StringAsset()..value = string; + } + + Future<_BinaryAsset> _readBinary(String fileName) async { + final data = await rootBundle.load('assets/$fileName'); + final Uint8List list = Uint8List.view(data.buffer); + + final bytes = List.from(list).cast(); + return _BinaryAsset()..value = bytes; } } + +class _Asset { + T value; +} + +class _StringAsset extends _Asset{} +class _BinaryAsset extends _Asset>{}