Skip to content

Commit c91cc18

Browse files
committed
feat(flutter): add assetLoader parameter and .fromBytes constructor
1 parent 4428188 commit c91cc18

1 file changed

Lines changed: 40 additions & 6 deletions

File tree

lib/src/file_loader.dart

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import 'dart:async' show Completer;
2+
import 'dart:typed_data';
23

34
import 'package:rive/rive.dart' as rive;
45
import '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

Comments
 (0)