Persist Flutter виджет в памяти - PullRequest
0 голосов
/ 25 ноября 2018

Я создал свою собственную простую нижнюю навигационную панель в Flutter.Когда вкладка нажата, Flutter в настоящее время воссоздает виджет (initState() вызывается каждый раз), что нежелательно.

Я хочу, чтобы виджеты были сохранены в памяти, поэтому, если они уже были созданы, они просто вставляются прямо.

Основной виджет

class _MainRootScreenState extends State<MainRootScreen> {

  int _selectedIndex = 0;

  List<Widget> _screens;

  @override
  void initState() {

    // load pages
    _screens = [
      PageOne(),
      PageTwo(),
      PageThree()
    ];

    super.initState();
  }


  @override
  Widget build(BuildContext context) {

    return Scaffold(
      body: _screens[_selectedIndex],
      bottomNavigationBar: _buildBottomTabBar(context)
    );
  }
}

, поэтому, когда _selectedIndex обновляется, выбранная страница воссоздается.

Я пытался использовать AutomaticKeepAliveClientMixin на страницах безуспешно.

1 Ответ

0 голосов
/ 25 ноября 2018

Если вы хотите, чтобы ваш виджет / страница не перестраивался при нажатии на кнопку вкладки.Вам просто нужно следовать этому коду

, просто добавьте State<PageOne> with AutomaticKeepAliveClientMixin<PageOne> в свой класс состояний.после этого вам нужно переопределить метод с именем wantKeepAlive и сделать wantKeepAlive истинным, вот и все.

По умолчанию wantKeepAlive имеет значение false, поскольку это экономит нашу память.

PageOne

class PageOne extends StatefulWidget {
  @override
  _PageOneState createState() => _PageOneState();
}
class _PageOneState extends State<PageOne> with AutomaticKeepAliveClientMixin<PageOne> {

  // Your code are here

  @override
  bool get wantKeepAlive => true;
}

Сделайте то же самое с pageTwo и PageThree и это все

...