颤振 - 每次我重新打开小部件时,文本字段都是空的



所以,我是 Flutter 的新手,正在尝试编写一个简单的笔记应用程序来学习我的方法。该应用程序的布局是一个HomePage,其列表视图为NoteTiles,点击时打开相应的NotePage,您可以在其中写下内容。我得到的问题是,每次我离开NotePage然后从HomePage重新打开它时,NotePage都会丢失其内容。
我的第一个想法是将内容保留在相应的NoteTile中,以便在我离开NotePage时,我会弹出内容,并在需要时将以前保存的内容推送到NotePage。问题是我没有找到任何简单的方法来推送和设置内容。我已经看到有通知和路由方法,但它们带有相当多的样板文件,它们看起来更像是将数据从子级传递到父级,这在弹出时我可以轻松完成。
那么,有没有办法避免重置NotePage的内容?或者,也许有一种简单的方法来initState以前保存的内容?
这是我到目前为止的代码:

class NoteTile extends ListTile {
final NotePage note;
final Text title;
final BuildContext context;
NoteTile(this.title, this.note, this.context) : super(
title: title,
onTap: () => {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => note),
),
},
onLongPress: () => null,
);
void switchToNote() async {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => note),
);
}
}

onLongPress稍后将用于删除注释。

class NotePage extends StatefulWidget {
final String title;
NotePage({Key key, this.title}) : super(key: key);
@override
_NotePageState createState() => _NotePageState();
}
class _NotePageState extends State<NotePage> {
TextEditingController _controller;
String _value;
void initState() {
super.initState();
_controller = TextEditingController();
_controller.addListener(_updateValue);
_value = '';
}
void dispose() {
_controller.dispose();
super.dispose();
}
void _updateValue(){
_value = _controller.text;
}
Future<bool> _onWillPop() async {
Navigator.pop(context, _value);
return true;
}
@override
Widget build(BuildContext context) {
return WillPopScope(
child: Scaffold(
appBar: AppBar(
title:  Text(widget.title),
),
body: Container(
child: TextField(
decoration: InputDecoration(
border: InputBorder.none,
hintStyle: TextStyle(fontStyle: FontStyle.italic),
hintText: 'New note',
),
maxLines: null,
controller: _controller,
),
padding: EdgeInsets.all(12.0),
),
),
onWillPop: _onWillPop,
);
}
}

_onWillPop是将内容发送回NoteTile,它目前忽略返回数据,因为我在以后再次推送NotePage时未能找到使用该数据的方法。

ListTileStatelessWidget小部件,因此您无法保留状态,NoteTileStatefulWidget

以下是NoteTile的示例:

class NoteTile extends StatefulWidget {
final Text title;
const NoteTile({Key key, this.title}) : super(key: key);
@override
State<StatefulWidget> createState() {
return _NoteTileState();
}
}
class _NoteTileState extends State<NoteTile> {
String _result;
@override
void initState() {
super.initState();
_result = "";
}
void _onOpenNote() async {
String result = await Navigator.of(context).push(
MaterialPageRoute(builder: (context) => NotePage(title: _result)),
);
if (result != null) {
_result = result;
}
}
@override
Widget build(BuildContext context) {
return ListTile(
title: widget.title,
onTap: _onOpenNote,
);
}
}

NotePage应该在某些行中进行编辑:

TextEditingController可以初始化字符串并必须通过title初始化:

_controller = TextEditingController(text: widget.title);

Navigator.pop可以发布结果并且您做对了,但是如果您想获得结果,则应等待Navigator.of(context).push,因为它在另一个线程中运行。

相关内容

  • 没有找到相关文章

最新更新