【问题标题】:Unable to update listview/gridview after implementation of bloc technique实施 bloc 技术后无法更新 listview/gridview
【发布时间】:2020-02-21 11:23:48
【问题描述】:

您好,在向数据库添加新注释后,我无法更新我的网格视图。

只是一点背景,在没有执行 bloc 的情况下添加新注释可以正常工作。但是在实施之后,我开始面临上述问题,但是没有显示错误消息。

非常感谢您提供的任何帮助!

我的集团提供者类:

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;
  }
}

我的班级:

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),
            ),
          ));
        });

【问题讨论】:

    标签: flutter dart bloc


    【解决方案1】:

    您需要按照官方文档中的建议正确实施 BLoC。然后你就可以使用 BLoC 监听器了。

    当前代码有什么问题,您没有任何已实现的侦听器。通过https://bloclibrary.dev/#/flutterfirebaselogintutorial

    上面的例子是一个精确的解决方案,你应该在更新任何东西后包含 Stream 监听器。然后您可以使用流更新您的对象。

    【讨论】:

    • 嗨,根据我对链接的理解,它使用了 flutter_bloc 包,它使用了与我现在正在做的不同的方法,它需要(状态、事件和 bloc 类)。虽然我的方法是这样的:freecodecamp.org/news/… 如何在不改变整个代码结构的情况下解决这个问题?从监听器实现开始。在我的 NoteBloc 构造函数下,它调用我的流控制器来监听。可以吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2011-01-06
    • 2011-12-09
    • 1970-01-01
    • 2012-02-02
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多