Нажмите на каждый элемент в Навигаторе с несколькими фрагментами во Флаттере, чтобы перезагрузить экран - PullRequest
0 голосов
/ 15 июня 2019

Я реализовал Навигационный ящик с несколькими фрагментами во флаттере, как показано ниже в руководстве, но когда я нажимаю на каждый элемент ящика навигации, он снова перестраивает каждый экран. Как я могу сохранить это? Я не хочу, чтобы каждый экран перестраивался. Заранее спасибо за помощь:)

https://medium.com/@kashifmin/flutter-setting-up-a-navigation-drawer-with-multiple-fragments-widgets-1914fda3c8a8?fbclid=IwAR2uur5NsehbJkh9FK8O6ZigmbQBx0V50i-DzyGlaJSpN7IkvijqhWL9GGw

class DrawerItem {
  String title;
  IconData icon;

  DrawerItem(this.title, this.icon);
}

class HomePage extends StatefulWidget {
  final drawerItems = [
    new DrawerItem("Sales", Icons.shopping_basket),
    new DrawerItem("Items", Icons.category),
    new DrawerItem("Setting", Icons.settings)
  ];

  @override
  State<StatefulWidget> createState() {
    return new _HomepageState();
  }
}

class _HomepageState extends State<HomePage> with TickerProviderStateMixin {
  int _selectedDrawerIndex = 0;

  _getDrawerItemWidget(int pos) {
    switch (pos) {
      case 0:
        return new SaleGrid();
      case 1:
        return new ItemsList();

      default:
        return new Text("Error");
    }
  }

  _onSelectItem(int index) {
    setState(() => _selectedDrawerIndex = index);
    Navigator.of(context).pop(); // close the drawer
  }

  @override
  Widget build(BuildContext context) {
    var drawerOptions = <Widget>[];
    for (var i = 0; i < widget.drawerItems.length; i++) {
      var d = widget.drawerItems[i];
      drawerOptions.add(new ListTile(
        leading: new Icon(d.icon),
        title: new Text(d.title),
        selected: i == _selectedDrawerIndex,
        onTap: () => _onSelectItem(i),
      ));
    }

    return new Scaffold(
      appBar: new AppBar(
        // here we display the title corresponding to the fragment
        // you can instead choose to have a static title
        title: new Text(widget.drawerItems[_selectedDrawerIndex].title),
      ),
      drawer: new Drawer(
        child: new Column(
          children: <Widget>[
            UserAccountsDrawerHeader(
              accountName: Text('Kimsung'),
              accountEmail: Text('kimsung@vehha.com.kh'),
              currentAccountPicture: ClipOval(
                child: Image.asset(
                  'assets/profile.jpg',
                  fit: BoxFit.cover,
                ),
              ),
            ),
            new Column(children: drawerOptions)
          ],
        ),
      ),
      body: _getDrawerItemWidget(_selectedDrawerIndex),
    );
  }
} 

1 Ответ

0 голосов
/ 15 июня 2019

Вы можете добавить, так сказать, AutomaticKeepAliveClientMixin к вашему фрагменту Drawer и установить флаг автоматического поддержания активности на true, а также вызвать super.build() в методе сборки.

class Fragment1 extends StatelessWidget with AutomaticKeepAliveClientMixin {

  @override
  bool get wantKeepAlive => true;

  @override
  Widget build(BuildContext context) {
    super.build(context);
    // return your widget tree
  }

}
...