【问题标题】:Want to show a list of cards with text which is coming from textfield on a screen when the send button is pressed当按下发送按钮时,想要在屏幕上的文本字段中显示带有文本的卡片列表
【发布时间】:2020-01-14 20:40:27
【问题描述】:

我想展示一张卡片,里面有文字。文本值来自 TextField 输入,只要按下按钮,它就会立即在新卡片上显示值。

我创建了两个单独的文件: notestream.dart 显示卡片,notetextfield.dart 将值发送到数据库

notetextfield.dart

文本字段

 TextField(
    controller: _textEditingController,
    textInputAction: TextInputAction.newline,
    onChanged: (value) {
    messageText = value;
    noteText = value;
  },
            ......
            ......
  ), 

onPressed

 IconButton(
       onPressed: () {
       _textEditingController.clear();
       /Implement send functionality.
       final newNote = Note(noteText: noteText);

       if (newNote.noteText.isNotEmpty) {
       /*Create new Note object and make sure
        the Note textis not empty,
        because what's the point of saving empty
        Note
       */
       noteBloc.addNote(newNote);
       noteBloc.getNotes();
   }
  }, 

notestream.dart

卡片将在包含卡片代码的单独文件的帮助下生成。

final NoteBloc noteBloc = NoteBloc();

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: noteBloc.notes,
      builder: (
                BuildContext context, 
                AsyncSnapshot<List<Note>>snapshot
               ) {

        if (snapshot.hasData) {
          /*Also handles whenever there's stream
          but returned returned 0 records of Note from DB.
          If that the case show user that you have empty Notes
         */
          return snapshot.data.length != 0
              ? ListView.builder(
                  itemCount: snapshot.data.length,
                  itemBuilder: (context, itemPosition) {
                    Note note = snapshot.data[itemPosition];
                    return NoteCard(
                      noteText: note.noteText,
                      noteImagePath: note.noteImagePath,
                    );
                  })

bloc.dart

class NoteBloc {
  //Get instance of the Repository
  final _noteRepository = NoteRepository();

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

  get notes => _noteController.stream;

  NoteBloc() {
    getNotes();
  }

  getNotes({String query}) async {
    //sink is a way of adding data reactively to the stream
    //by registering a new event
    _noteController.sink.add(await _noteRepository.getAllNotes(query: 
 query));
  }

  addNote(Note note) async {
    await _noteRepository.insertNote(note);
    getNotes();
  }

  updateTodo(Note note) async {
    await _noteRepository.updateNote(note);
    getNotes();
  }

  dispose() {
    _noteController.close();
  }
} 

每当我按下 notetextfield.dart 文件中的 onPressed 按钮时,卡片列表都不会显示在屏幕上。

【问题讨论】:

  • 你到底有什么疑问?
  • 更新了问题的最后一部分。
  • 可以添加bloc类吗?
  • @haroldolivieri 添加了
  • onPressed 中使用的 bloc 实例与 notestream.dart 中使用的实例相同吗?

标签: sqlite flutter dart bloc


【解决方案1】:

看起来您在每个文件上使用了不同的 NoteBloc 实例,您应该有一个单一的事实来源。

尝试使用provider library 在父级上提供实例并在其子级上使用它。

你会像这样在父 Widget 上提供 bloc

Provider<NoteBloc>(
  builder: (context) => NoteBloc(noteRepository: NoteRepository()),
  dispose: (context, value) => value.dispose()
  child: ParentWidget(),
)

你可以在任何这样的孩子身上食用它

final bloc = Provider.of<NoteBloc>(BuildContext context)

或者如果您更喜欢包装小部件,则可以这样做

Consumer<NoteBloc>(
    builder: (context, bloc, _) => ChildWidget()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多