Привет Я не могу обновить свой 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),
),
));
});