-
Notifications
You must be signed in to change notification settings - Fork 10
/
example.dart
72 lines (60 loc) · 2.46 KB
/
example.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//
// Copy of https://github.com/jifalops/async_resource/blob/master/example/packages/base/lib/resources.dart
//
/// The resources required by mobile and web versions of the app.
///
/// This isn't really necessary to do, but it helps make sure mobile and web
/// versions of the app are consistent, and makes designing a bit easier.
abstract class Resources {
Resources({@required this.posts, @required this.darkBackground});
final LocalResource<bool> darkBackground;
/// [AsyncResource]s use [Future]s by default, but they can be wrapped in a
/// [StreamedResource] to access them using a sink and stream.
final NetworkResource<Iterable<Post>> posts;
}
//
// Copy of https://github.com/jifalops/async_resource/blob/master/example/packages/mobile/lib/src/resources.dart
//
/// Shorthand for `MobileResources.instance`.
MobileResources get resources => MobileResources._instance;
class MobileResources extends Resources {
MobileResources._(this.path)
: super(
posts: HttpNetworkResource<Iterable<Post>>(
url: postsUrl,
parser: (contents) => Post.fromJsonArray(contents),
cache: FileResource(File('$path/posts.json')),
maxAge: Duration(days: 30),
strategy: CacheStrategy.cacheFirst,
),
darkBackground: BoolPrefsResource('darkBackground'),
);
final String path;
static MobileResources _instance;
static MobileResources get instance => _instance;
/// Do one-time initialization of [resources].
static Future<MobileResources> init() async => _instance ??=
MobileResources._((await getApplicationDocumentsDirectory()).path);
}
//
// Copy of https://github.com/jifalops/async_resource/blob/master/example/packages/web/lib/src/resources.dart
//
/// This can be created synchronously because it does not need to wait for a
/// file from the system like the mobile version does.
final resources = WebResources._();
class WebResources extends Resources {
WebResources._()
: super(
posts: ServiceWorkerResource<Iterable<Post>>(
strategy: CacheStrategy.cacheFirst,
cache: ServiceWorkerCacheEntry(
name: 'async_resource_example',
url: postsUrl,
parser: (contents) => Post.fromJsonArray(contents),
maxAge: Duration(days: 30),
),
),
darkBackground: StorageEntry<bool>('darkBackground',
parser: (contents) => contents == 'true'),
);
}