【问题标题】:StatefulWidget gets disposed on navigationStatefulWidget 在导航上得到处理
【发布时间】:2019-04-16 14:55:01
【问题描述】:

我有一个包含 ListView 的有状态小部件 MyList。在点击任何列表图块时,新屏幕(MyScreen)打开,返回后(通过按左上角的返回按钮)滚动位置丢失,因为 MyList 被释放并且 initState 再次运行。如何防止 MyList 被销毁?

class MyList extends StatefulWidget {
      @override
      _MyListState createState() => new _MyListState();
    }

class _MyListState extends State<MyList> {
  List<String> items = new List.generate(20, (index) => 'Hello $index');

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Scrollbar(
        child: new ListView.builder(
          itemBuilder: (context, index) {
            return new ListTile(
              title: Text(items[index] + ' index $index'),
              onTap: () {
                Navigator.push(
                    context,
                    new MaterialPageRoute(
                      builder: (BuildContext context) => new MyScreen(index),
                    ));
              },
            );
          },
          itemCount: items.length,
        ),
      ),
    );
  }
}

这是我的屏幕:

class MyScreen extends StatefulWidget {
  final int indx;
  MyScreen(this.indx);
  _TaskDetailState createState() => new _TaskDetailState();
}

class _TaskDetailState extends State<MyScreen> {
  @override
  void initState() {
    super.initState();
  }

  Widget build(context) {
    return Scaffold(
      appBar: AppBar(
        elevation: 0.0,
        title: Text('yoba'),
      ),
      body: Text('yoba ${widget.indx}'),
    );
  }
}

【问题讨论】:

标签: flutter


【解决方案1】:

您需要将PageStorageKey 添加到您的 ListView 小部件。

class _MyListState extends State<MyList> {
  List<String> items = new List.generate(20, (index) => 'Hello $index');

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Scrollbar(
        child: new ListView.builder(
          key: PageStorageKey("MyList"), // <-- Add this line
          itemBuilder: (context, index) {
            return new ListTile(
              title: Text(items[index] + ' index $index'),
              onTap: () {
                Navigator.push(
                    context,
                    new MaterialPageRoute(
                      builder: (BuildContext context) => new MyScreen(index),
                    ));
              },
            );
          },
          itemCount: items.length,
        ),
      ),
    );
  }
}

【讨论】:

  • 这似乎是一种解决方法,但不能准确工作并且没有回答问题:如何维护有状态小部件的状态?
  • 这不是一种解决方法,使用 PageStorageKey 是保持滚动位置的推荐方法。如果这不能解决您的问题,则问题可能是由小部件树更远的小部件引起的,导致其子级重建。
  • 当我添加 scrollListener 并生成新的列表项并使用它们填充项目并使用 setSate 将它们保存在状态时,当状态被释放时,项目列表会刷新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多