Flutter:如何避免为应用程序的某些部分重新创建模型?

时间:2020-03-30 17:00:06

标签: flutter flutter-provider

我的应用在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并保留用户的输入?

2 个答案:

答案 0 :(得分:0)

您可以通过两种方式解决此问题:

  1. 在小部件外部创建模型,并将小部件模型作为变量传递给构造函数,或者使用Provider或任何其他依赖注入技术。

  2. 使用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())

    ...
  }
}