Виджет состояния с флаттером не обновляется при вызове из ящика навигации - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь обновить виджет своего класса с сохранением состояния при вызове его из окна навигации.виджет без состояния обновляется при вызове из окна навигации.Вот мой навигационный ящик, откуда я называю «Фрагмент первый».

class DrawerItem {
String title;
IconData icon;
DrawerItem(this.title, this.icon);
 }

class HomePage extends StatefulWidget {
 final drawerItems = [
   new DrawerItem("First Fragment", Icons.rss_feed),
   new DrawerItem("Second Fragment", Icons.local_pizza),
   new DrawerItem("Third Fragment", Icons.info)
 ];

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

class HomePageState extends State<HomePage> {
 int _selectedDrawerIndex = 0;

  _getDrawerItemWidget(int pos) {
    switch (pos) {
  case 0:

    return new FirstFragmen(pos);
  case 1:

    return new FirstFragmen(pos);
  case 2:

    return new FirstFragmen(pos);

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

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

 @override
 Widget build(BuildContext context) {
   List<Widget> drawerOptions = [];
   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>[
        new UserAccountsDrawerHeader(
            accountName: new Text("John Doe"), accountEmail: null),
        new Column(children: drawerOptions)
      ],
    ),
     ),
     body: _getDrawerItemWidget(_selectedDrawerIndex),
   );
    }
 }

Вот первый фрагмент:

class FirstFragment extends StatefulWidget {

 int pos;
 FirstFragment(this.pos);
@override
 _FirstFragmentState createState() => new _FirstFragmentState(pos);
 }

 class _FirstFragmentState extends State<FirstFragment> {
 int pos;
 _FirstFragmentState(this.pos);

 @override
 Widget build(BuildContext context) {

  // TODO: implement build
  return new Center(
  child: new Text("Hello Fragment $pos"), >printing 'pos' only. It remains 
  > same all time when new class is called. 
  );
 }
}

если я использую виджет без сохранения состояния, то он обновляется, но виджет с состоянием не обновляется.Я пытался отлаживать, используя точки останова, но класс _FirstFragmentState вызывается только один раз.Есть ли способ перерисовать все виджеты при его вызове во второй раз.

1 Ответ

0 голосов
/ 07 июня 2018

Состояние создается один раз, а затем совместно используется для нескольких экземпляров вашего виджета.Поскольку вы принимаете pos в конструкторе состояний, он не будет обновляться позже при изменении виджетов.

Один из способов решить эту проблему - удалить pos в вашем _FirstFragmentState и ссылаться наpos в FirstFragment напрямую.Вы можете получить к нему доступ через поле widget вашего класса состояний.

class _FirstFragmentState extends State<FirstFragment> {
  @override
  Widget build(BuildContext context) {
   return new Center(
     child: new Text("Hello Fragment ${widget.pos}"), // -> use pos from FirstFragment
   );
  }
}
...