Флаттер: Как я могу избежать воссоздания модели для частей приложения? - PullRequest
0 голосов
/ 30 марта 2020

Мое приложение использует набор Card() s внутри PageView(), каждая карта имеет несколько строк текста. Пользователь дает ввод для каждой строки (например, изменяя текст и т. Д. c.). Я хочу сохранить этот ввод некоторое время.

Вот так выглядит мой код в настоящее время, абстрактно говоря:

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 голосов
/ 31 марта 2020

Как гласит официальная документация , мы можем просто использовать конструктор ChangeNotifierProvider.value() ...

В исходном коде:

class MyCardState extends State<MyCard> {

  ...

  @override
  Widget build(BuildContext context) {

    ...

    widget._myLines.add(ChangeNotifierProvider.value(
              value: MyLineModel(context, lineText),
              child: RecipeLine())

    ...
  }
}
0 голосов
/ 30 марта 2020

Вы можете решить эту проблему двумя способами:

  1. Создать модель вне виджета и передать модель для виджета, например, в качестве переменной конструктору или используя Provider или любой другой метод внедрения зависимостей.

  2. Использование любого из KeepAlive API, таких как AutomaticKeepAliveClientMixin as:

class MyCardState extends State<MyCard> with AutomaticKeepAliveClientMixin {

...

  @override
  bool get wantKeepAlive => true;
}
...