【问题标题】:Flutter stateful widget is not updating while calling from Navigation drawer从导航抽屉调用时,颤振有状态小部件未更新
【发布时间】:2018-06-07 13:32:19
【问题描述】:

我正在尝试更新我的类的有状态小部件,同时从 Navigation Drawer 调用它。从导航抽屉调用无状态小部件时,它们正在更新。这是我称之为“片段优先”的导航抽屉。

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 类只被调用一次。有没有办法在第二次调用时重绘所有小部件。

【问题讨论】:

  • setState(() {})
  • 这不起作用我试过了。

标签: flutter stateful


【解决方案1】:

状态创建一次,然后为您的小部件的多个实例共享。由于您在状态构造函数中使用pos,因此稍后在小部件更改时不会更新它。

解决此问题的一种方法是删除_FirstFragmentState 中的pos,并直接引用FirstFragment 中的pos。您可以通过状态类的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
   );
  }
}

【讨论】:

  • 如何直接从 FirstFragment 类调用 setState() 方法?
  • 嗯,我不明白。为什么不能调用 setState()?
  • setState() 可以从 _FirstFragmentState 调用,所以当我再次返回同一个类时,我无法调用 setState 方法。
  • 我不关注。当你“回到同一个班级”并调用 setState 会发生什么?
  • 我称它为 FirstFragment(this.pos){ setState();我收到运行时错误,无法从构造函数调用 setState
猜你喜欢
  • 1970-01-01
  • 2020-09-26
  • 2022-11-12
  • 2021-07-19
  • 2020-04-15
  • 2019-09-14
  • 2019-11-03
  • 2021-02-02
  • 2021-11-12
相关资源
最近更新 更多