11import 'dart:async' show Completer;
2+ import 'dart:typed_data' ;
23
34import 'package:rive/rive.dart' as rive;
45import 'package:rive/src/errors.dart' ;
6+ import 'package:rive_native/rive_native.dart' show AssetLoaderCallback;
57
68/// {@template FileLoader}
79/// A class that loads a Rive file from an asset, URL, or file.
@@ -18,29 +20,46 @@ class FileLoader {
1820 final rive.Factory riveFactory;
1921 final rive.File ? _providedFile;
2022 final String ? _asset;
23+ final Uint8List ? _bytes;
2124 final String ? _url;
25+ final AssetLoaderCallback ? assetLoader;
26+
2227 Completer <rive.File >? _loadCompleter;
2328 rive.File ? _loadedFile;
2429
2530 /// {@macro FileLoader}
2631 /// - The [asset] parameter is the asset to load the Rive file from.
27- FileLoader .fromAsset (String asset, {required this .riveFactory})
32+ FileLoader .fromAsset (String asset,
33+ {required this .riveFactory, this .assetLoader})
2834 : _asset = asset,
35+ _bytes = null ,
2936 _providedFile = null ,
3037 _url = null ;
3138
3239 /// {@macro FileLoader}
3340 /// - The [url] parameter is the URL to load the Rive file from.
34- FileLoader .fromUrl (String url, {required this .riveFactory})
41+ FileLoader .fromUrl (String url, {required this .riveFactory, this .assetLoader })
3542 : _url = url,
43+ _asset = null ,
44+ _bytes = null ,
45+ _providedFile = null ;
46+
47+ /// {@macro FileLoader}
48+ /// - The [bytes] parameter is the bytes to load the Rive file from.
49+ FileLoader .fromBytes (Uint8List bytes,
50+ {required this .riveFactory, this .assetLoader})
51+ : _bytes = bytes,
52+ _asset = null ,
3653 _providedFile = null ,
37- _asset = null ;
54+ _url = null ;
3855
3956 /// {@macro FileLoader}
4057 /// - The [file] parameter is the file to load the Rive file from.
4158 FileLoader .fromFile (rive.File file, {required this .riveFactory})
42- : _providedFile = file,
59+ : assetLoader = null ,
60+ _providedFile = file,
4361 _asset = null ,
62+ _bytes = null ,
4463 _url = null ;
4564
4665 Future <rive.File > file () async {
@@ -60,7 +79,8 @@ class FileLoader {
6079
6180 if (_asset != null ) {
6281 try {
63- file = await rive.File .asset (_asset, riveFactory: riveFactory);
82+ file = await rive.File .asset (_asset,
83+ riveFactory: riveFactory, assetLoader: assetLoader);
6484 } catch (e) {
6585 // Handle the case where the asset doesn't exist or has empty data
6686 throw RiveFileLoaderException (
@@ -70,9 +90,23 @@ class FileLoader {
7090 throw RiveFileLoaderException (
7191 'Failed to decode Rive file from asset: $_asset ' );
7292 }
93+ } else if (_bytes != null ) {
94+ try {
95+ file = await rive.File .decode (_bytes,
96+ riveFactory: riveFactory, assetLoader: assetLoader);
97+ } catch (e) {
98+ // Handle the case where the bytes are invalid or empty
99+ throw RiveFileLoaderException (
100+ 'Failed to load Rive file from bytes. Error: $e ' );
101+ }
102+ if (file == null ) {
103+ throw RiveFileLoaderException (
104+ 'Failed to decode Rive file from bytes' );
105+ }
73106 } else if (_url != null ) {
74107 try {
75- file = await rive.File .url (_url, riveFactory: riveFactory);
108+ file = await rive.File .url (_url,
109+ riveFactory: riveFactory, assetLoader: assetLoader);
76110 } catch (e) {
77111 // Handle the case where the URL fails to load
78112 throw RiveFileLoaderException (
0 commit comments