我的应用在Card()
内使用了一组PageView()
,每张卡都有多行文本。
用户为每一行提供输入(例如,修改文本等)。
我想把这个输入保留一段时间。
这就是我的代码的外观,抽象地说:
class MyCard extends StatefulWidget {
final List<Widget> _myLines = [];
@override
State<StatefulWidget> createState() => MyCardState();
}
class MyCardState extends State<MyCard> {
...
@override
Widget build(BuildContext context) {
...
widget._myLines.add(ChangeNotifierProvider(
create: (context) => MyLineModel(context, lineText),
child: RecipeLine())
...
}
}
这不能很好地工作:
当我在PageView
上向左/右滑动到其他卡上然后向后滑动时,Card
再次被构建。这也将导致MyLineModel
的重建,从而删除所有用户的输入。
如何避免重建MyLineModel
并保留用户的输入?
答案 0 :(得分:0)
您可以通过两种方式解决此问题:
在小部件外部创建模型,并将小部件模型作为变量传递给构造函数,或者使用Provider
或任何其他依赖注入技术。
使用KeepAlive
之类的任何AutomaticKeepAliveClientMixin
API,例如:
class MyCardState extends State<MyCard> with AutomaticKeepAliveClientMixin {
...
@override
bool get wantKeepAlive => true;
}
答案 1 :(得分:-1)
正如official documentation所述,我们可以简单地使用ChangeNotifierProvider.value()
构造函数...
在原始代码中:
class MyCardState extends State<MyCard> {
...
@override
Widget build(BuildContext context) {
...
widget._myLines.add(ChangeNotifierProvider.value(
value: MyLineModel(context, lineText),
child: RecipeLine())
...
}
}