Этаж BLoC реализация - PullRequest
       26

Этаж BLoC реализация

0 голосов
/ 24 сентября 2019

Я новичок во флаттере, на самом деле я пытаюсь реализовать 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);

}
...