使用 bloc 模式缓存数据
Caching data while using the bloc pattern
我想在我的应用程序中实现缓存,这样数据只加载一次,然后每次重新加载页面时,都不必再次获取数据
下面的代码是一个页面块。
import 'dart:async';
import 'dart:collection';
import 'package:eightoeight/eightoeight.dart';
import 'package:rxdart/rxdart.dart';
class AlbumBloc {
DatabaseClient db;
Stream<List<AudioTrack>> get albums => _albumSubject.stream;
final _albumSubject = BehaviorSubject<UnmodifiableListView<AudioTrack>>();
final modeController = StreamController<int>();
Sink<int> get mode => modeController.sink;
var _albums = <AudioTrack>[];
AlbumBloc() {
create();
}
void create() async {
if (db == null) {
this.db = new DatabaseClient();
await this.db.create();
}
modeController.add(0);
modeController.stream.listen(onData);
}
void onData(int num) {
if (num == null) {
_updateSongs(0).then((_) {
_albumSubject.add(UnmodifiableListView(_albums));
});
} else if (num == 1) {
_updateSongs(1).then((_) {
_albumSubject.add(UnmodifiableListView(_albums));
});
} else if (num == 2) {
_updateSongs(2).then((_) {
_albumSubject.add(UnmodifiableListView(_albums));
});
} else {
_updateSongs(0).then((_) {
_albumSubject.add(UnmodifiableListView(_albums));
});
}
}
Future<Null> _updateSongs(int num) async {
var tracks;
if (num == 1) {
tracks = await db.fetchAlbumOrderArtist();
} else {
tracks = await db.fetchAlbum();
}
_albums = tracks;
}
}
上面的代码只是从数据库中获取一个列表。我希望它仅在应用程序启动时从数据库中获取数据,然后在后续请求时从缓存中加载数据。谢谢
- 像
AlbumDataRepository
. 创建存储库 class
- 里面有像
fetchData
这样的方法。
- 从您的 BLoC 调用该方法。
- 在该存储库的
fetchData()
中 class 首先检查数据是否在缓存中可用
一种。如果数据在缓存中,则获取它并 return。
b.如果数据不在缓存中,则从数据库中获取数据并将其存储在缓存中,然后 return 该数据。
注意: 在您的存储库 class 中,您还应该有类似 clearCache
的方法。当数据过期时调用该方法并从缓存中删除所有数据,以便下次获得更新的数据。
我想在我的应用程序中实现缓存,这样数据只加载一次,然后每次重新加载页面时,都不必再次获取数据
下面的代码是一个页面块。
import 'dart:async';
import 'dart:collection';
import 'package:eightoeight/eightoeight.dart';
import 'package:rxdart/rxdart.dart';
class AlbumBloc {
DatabaseClient db;
Stream<List<AudioTrack>> get albums => _albumSubject.stream;
final _albumSubject = BehaviorSubject<UnmodifiableListView<AudioTrack>>();
final modeController = StreamController<int>();
Sink<int> get mode => modeController.sink;
var _albums = <AudioTrack>[];
AlbumBloc() {
create();
}
void create() async {
if (db == null) {
this.db = new DatabaseClient();
await this.db.create();
}
modeController.add(0);
modeController.stream.listen(onData);
}
void onData(int num) {
if (num == null) {
_updateSongs(0).then((_) {
_albumSubject.add(UnmodifiableListView(_albums));
});
} else if (num == 1) {
_updateSongs(1).then((_) {
_albumSubject.add(UnmodifiableListView(_albums));
});
} else if (num == 2) {
_updateSongs(2).then((_) {
_albumSubject.add(UnmodifiableListView(_albums));
});
} else {
_updateSongs(0).then((_) {
_albumSubject.add(UnmodifiableListView(_albums));
});
}
}
Future<Null> _updateSongs(int num) async {
var tracks;
if (num == 1) {
tracks = await db.fetchAlbumOrderArtist();
} else {
tracks = await db.fetchAlbum();
}
_albums = tracks;
}
}
上面的代码只是从数据库中获取一个列表。我希望它仅在应用程序启动时从数据库中获取数据,然后在后续请求时从缓存中加载数据。谢谢
- 像
AlbumDataRepository
. 创建存储库 class
- 里面有像
fetchData
这样的方法。 - 从您的 BLoC 调用该方法。
- 在该存储库的
fetchData()
中 class 首先检查数据是否在缓存中可用 一种。如果数据在缓存中,则获取它并 return。 b.如果数据不在缓存中,则从数据库中获取数据并将其存储在缓存中,然后 return 该数据。
注意: 在您的存储库 class 中,您还应该有类似 clearCache
的方法。当数据过期时调用该方法并从缓存中删除所有数据,以便下次获得更新的数据。