Невозможно обновить listview / gridview после реализации метода blo c - PullRequest
0 голосов
/ 21 февраля 2020

Привет Я не могу обновить свой gridview, после добавления новой заметки в базу данных.

Немного предыстории, добавление новой заметки работает нормально без реализации blo c. Но после его реализации я начал сталкиваться с вышеуказанной проблемой, однако без сообщения об ошибке.

Любая предоставленная помощь высоко ценится!

My blo c класс провайдера:

import 'package:flutter/material.dart';

abstract class BlocBase{
  void dispose();
}

class BlocProvider<T extends BlocBase> extends StatefulWidget{
  BlocProvider({
    Key key,
    @required this.child,
    @required this.bloc,
  }) : super(key: key);

  final T bloc;
  final Widget child;
  @override
  _BlocProviderState<T> createState() => _BlocProviderState<T>();

  static T of<T extends BlocBase>(BuildContext context){
    final type = _typeOf<BlocProvider<T>>();
    BlocProvider<T> provider = context.ancestorWidgetOfExactType(type);
    return provider.bloc;
  }

  static Type _typeOf<T>() => T;
}

class _BlocProviderState<T> extends State<BlocProvider<BlocBase>>{
  @override
  void dispose(){
    widget.bloc.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context){
    return widget.child;
  }
}

Мой блок c класс:

class NotesBloc implements BlocBase{
  final _notesController = StreamController<List<Note>>.broadcast();

  StreamSink<List<Note>> get _inNotes => _notesController.sink;

  Stream<List<Note>> get notes => _notesController.stream;

  final _reminderController = StreamController<List<Note>>.broadcast();

  StreamSink<List<Note>> get _inReminderNotes => _reminderController.sink;

  Stream<List<Note>> get reminderNotes => _reminderController.stream;

  final _saveNoteController = StreamController<Note>.broadcast();
  StreamSink<Note> get inSaveNote => _saveNoteController.sink;
  final _deleteNoteController = StreamController<Note>.broadcast();
  StreamSink<Note> get inDeleteNote => _deleteNoteController.sink;

  final _noteDeletedController = StreamController<bool>.broadcast();
  StreamSink<bool> get _inDeleted => _noteDeletedController.sink;
  Stream<bool> get deleted => _noteDeletedController.stream;

  NotesBloc(){
    getNotes();
    getNotesReminder();
    _saveNoteController.stream.listen(_handleSaveNote);
    _deleteNoteController.stream.listen(_handleDeleteNote);
  }

  @override
  void dispose() {
    _notesController.close();
    _saveNoteController.close();
    _deleteNoteController.close();
    _noteDeletedController.close();
    _reminderController.close();
  }

  void getNotes() async{
    List<Note> notes = await DatabaseHelper.db.getNoteList();
    _inNotes.add(notes);
  }

  void _handleSaveNote(Note note) async {
    if (note.id == null) {
      await DatabaseHelper.db.insertNote(note);
      print('note added');
    } else {
      await DatabaseHelper.db.updateNote(note);
      print('note saved');
    }
    getNotes();
  }

  void _handleDeleteNote(Note note) async {
    await DatabaseHelper.db.deleteNote(note);
    _inDeleted.add(true);
    getNotes();
  }

  void getNotesReminder() async{
    List<Note> notes = await DatabaseHelper.db.getNoteListByReminderDate();
    _inReminderNotes.add(notes);
    getNotes();
  }
}

Мой метод отправки в editAddActivty:

void _submit() async {
    if (_formKey.currentState.validate()) {
      note.title = _titleController.text;
      note.bodyText = _bodyTextController.text;
      DateTime _date = DateTime.now();
      note.date = _date.toString();
      _noteBloc.inSaveNote.add(note);
      Navigator.of(context).pop();
      print('saved');
    }
  }

Моя основная деятельность, в которой должна отображаться моя новая добавленная заметка, но это не так. :

return StreamBuilder(
        // stream: reminder == reminderType.ForMain ? _notesBloc.notes : _notesBloc.reminderNotes,
        stream: _notesBloc.notes,
        builder: (BuildContext context, AsyncSnapshot<List<Note>> snapshot) {
          List<Note> noteList = snapshot.data;
          return Container(
              child: Padding(
            padding: _paddingForView(context),
            child: new StaggeredGridView.count(
              key: _stagKey,
              crossAxisSpacing: 6,
              mainAxisSpacing: 6,
              crossAxisCount: _colForStaggeredView(context),
              children: List.generate(snapshot.data?.length ?? 0, (i) {
                return MyStaggeredTile(noteList[i]);
              }),
              staggeredTiles: _tilesForView(noteList),
            ),
          ));
        });

1 Ответ

0 голосов
/ 21 февраля 2020

Вам необходимо правильно реализовать BLo C, как рекомендовано в Официальных документах. Затем вы можете использовать BLo C listener.

В чем проблема с текущим кодом, у вас нет реализованного слушателя. Go - https://bloclibrary.dev/# / flutterfirebaselogintutorial

Верхний пример - точное решение, в которое следует включить потоковый прослушиватель после обновления чего-либо. Затем вы можете обновить свой объект, используя потоки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...