0

我开始使用颤振/飞镖,我正在尝试使用 InheritedWidget 和 TextControllers 实现一个简单的笔记应用程序,但是当我添加或编辑一些笔记时,它不会更新主屏幕。我在控制台中打印了新的笔记列表,它通过添加和编辑进行了更新,但在主屏幕中没有更新,仍然显示初始笔记列表({'title':'someTitle1','text':'someText1'}, ...)。

主要飞镖:

void main() => runApp(NoteInheritedWidget(
  MaterialApp(
    title: 'Notes App',
    home: HomeList(),
  ),
));

主屏幕脚手架主体:

List<Map<String, String>> get _notes => NoteInheritedWidget.of(context).notes;
...
body: ListView.builder(
    itemCount: _notes.length,
    itemBuilder: (context, index) {
      return Card(
        margin: EdgeInsets.symmetric(vertical: 5, horizontal: 7),
        child: ListTile(
          onTap: () {
            Navigator.push(context,
                MaterialPageRoute(builder: (context) => NotePage(noteMode: NoteMode.Editing, index: index))
            );
            print(_notes);
          },
          trailing: Icon(Icons.more_vert),
          title: _NoteTitle(_notes[index]['title']),
          subtitle: _NoteText(_notes[index]['text']),
        ),
      );
    },
  ),

添加/编辑注释页面:

enum NoteMode {
  Adding,
  Editing
}

class NotePage extends StatefulWidget {

  final NoteMode noteMode;
  final int index;

  const NotePage ({this.noteMode, this.index});

  @override
  _NotePageState createState() => _NotePageState();
}

class _NotePageState extends State<NotePage> {

  final TextEditingController _titleController = TextEditingController();
  final TextEditingController _textController = TextEditingController();

  List<Map<String, String>> get _notes => NoteInheritedWidget.of(context).notes;

  @override
  void didChangeDependencies() {
    if (widget.noteMode == NoteMode.Editing) {
      _titleController.text = _notes[widget.index]['text'];
      _textController.text = _notes[widget.index]['title'];
    }
    super.didChangeDependencies();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(
          widget.noteMode == NoteMode.Adding ? 'Add Note' : 'Edit Note'
        ),
        centerTitle: true,
        backgroundColor: Colors.indigo[700],
      ),
      body: Padding(
        padding: const EdgeInsets.symmetric(vertical: 30, horizontal: 20),
        child: SingleChildScrollView(
          child: Column(
            children: <Widget>[
              TextField(
                controller: _titleController,
                decoration: InputDecoration(
                  hintText: 'Note Title',
                  border: OutlineInputBorder(),
                ),
              ),
              SizedBox(height: 20),
              TextField(
                controller: _textController,
                maxLines: 20,
                decoration: InputDecoration(
                  hintText: 'Note Text',
                  border: OutlineInputBorder(),
                ),
              ),
              SizedBox(height: 10),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: <Widget>[
                  _NoteButton(Icons.save, 'Save', () {
                    final title = _titleController.text;
                    final text = _textController.text;

                    if (widget.noteMode == NoteMode.Adding) {
                      _notes.add({'title': title, 'text': text});
                      print(_notes);
                    } else if (widget.noteMode == NoteMode.Editing) {
                      _notes[widget.index] = {'title': title, 'text': text};
                      print(_notes);
                    }
                    Navigator.pop(context);
                  }),
                  _NoteButton(Icons.clear, 'Discard', () {
                    Navigator.pop(context);
                  }),
                  if (widget.noteMode == NoteMode.Editing)
                    _NoteButton(Icons.delete, 'Delete', () {
                      _notes.removeAt(widget.index);
                      Navigator.pop(context);
                    }),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}

继承小部件:

class NoteInheritedWidget extends InheritedWidget {

  final notes = [
    {'title': 'someTitle1', 'text': 'someText1'},
    {'title': 'someTitle2', 'text': 'someText2'},
    {'title': 'someTitle3', 'text': 'someText3'}
  ];

  NoteInheritedWidget(Widget child) : super(child: child);

  static NoteInheritedWidget of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<NoteInheritedWidget>();
  }

  @override
  bool updateShouldNotify(NoteInheritedWidget old) {
    return old.notes != notes;
  }
}

添加注释后的主屏幕: HomeScreen

添加注释后在控制台中打印的注释列表:

I/flutter (18079): [{title: someTitle1, text: someText1}, {title: someTitle2, text: someText2}, {title: someTitle3, text: someText3}, {title: NewAddNoteTitle, text: NewAddNoteText}]

我正在使用 Android Studio 和真实设备而不是模拟器。我找不到错误,如果您有其他方法来执行此“更新”,请告诉我。

4

1 回答 1

1

我找到了一个使用 onPressed 方法作为 async 的解决方案,然后是一个空的 setState,这样做的代码有什么问题吗?

代码:

child: ListTile(
          onTap: () async {
            await Navigator.push(context,
                MaterialPageRoute(builder: (context) => NotePage(noteMode: NoteMode.Editing, index: index))
            );
            setState(() {});
            print(_notes);
          },
...
   floatingActionButton: FloatingActionButton(
    onPressed: () async {
      await Navigator.push(context,
          MaterialPageRoute(builder: (context) => NotePage(noteMode: NoteMode.Adding))
      );
      setState(() {});
      print(_notes.length);
      print(_notes);
    },
于 2020-04-06T16:57:29.900 回答