Я новичок во флаттере, на самом деле я пытаюсь реализовать Floor с помощью реализации BLoC, я не могу понять, почему, когда я добавляю избранное, оно работает, но когда я удаляю одно, это не так?Вот мой код (также, если вы могли бы сказать мне, как это хорошая или плохая реализация):
Часть моего основного файла, который реализует блок:
leading: StreamBuilder<List<Fav>>(
stream: dbBloc.outFavorites,
builder: (context, snapshot) {
if (snapshot.hasData) {
List<Fav> f = dbBloc.favoBase;
bool isFavorite = false;
if(f.length > 0) {
for(Fav fav in f){
if(fav.id == article.id) isFavorite = true;
}
}
if (isFavorite) {
return IconButton(
icon: Icon(Icons.star),
onPressed: () {
Fav f = Fav(article.id, article.title, article.url);
dbBloc.inRemoveFavorite.add(f);
});
} else {
return IconButton(
icon: Icon(Icons.star_border),
onPressed: () {
Fav fav = Fav(article.id, article.title, article.url);
dbBloc.inAddFavorite.add(fav);
});
}
} else
return IconButton(
icon: Icon(Icons.star_border),
onPressed: () {
Fav fav = Fav(article.id, article.title, article.url);
dbBloc.inAddFavorite.add(fav);
//dao.insertFav(fav);
});
})
Мой класс блока:
static List<Fav> _favoBase = List<Fav>();
List<Fav> get favoBase => _favoBase;
Stream<List<Fav>> get outFavorites =>_favoritesController.stream;
BehaviorSubject<Fav> _favoriteAddController = BehaviorSubject<Fav>();
Sink<Fav> get inAddFavorite => _favoriteAddController.sink;
BehaviorSubject<List<Fav>> _favoritesController = new BehaviorSubject<List<Fav>>(seedValue: []);
Sink<List<Fav>> get _inFavorites =>_favoritesController.sink;
BehaviorSubject<Fav> _favoriteRemoveController = new BehaviorSubject<Fav>();
Sink<Fav> get inRemoveFavorite => _favoriteRemoveController.sink;
DbBloc(){
loadFav();
_favoriteAddController.listen(_handleAddFavorite);
_favoriteRemoveController.listen(_handleRemoveFavorite);
}
void _notify(){
_inFavorites.add(UnmodifiableListView(_favoBase));
}
void _handleAddFavorite(Fav fav) async {
// Add the movie to the list of favorite ones
final db = await loadDb();
await db.favDao.insertFav(fav);
_favoBase.add(fav);
_notify();
}
void _handleRemoveFavorite(Fav fav) async{
final db = await loadDb();
await db.favDao.deleteFavById(fav);
_favoBase.remove(fav);
_notify();
}
void dispose(){
_favoriteAddController.close();
_favoritesController.close();
_favoriteRemoveController.close();
}
Future<AppDatabase> loadDb() async {
return await $FloorAppDatabase
.databaseBuilder('app_database.db')
.build();
}
Future<void> loadFav () async {
final db = await loadDb();
final favo = await db.favDao.findAllFavs();
_favoBase = favo.toList();
}
}
Мой класс DAO:
@dao
abstract class FavDao{
@Query('SELECT * FROM Fav')
Future<List<Fav>> findAllFavs();
@Query('SELECT * FROM Fav WHERE id = :id')
Future<Fav> findFavById(int id);
@insert
Future<void> insertFav(Fav fav);
@delete
Future<void> deleteFavById(Fav fav);
}