flutter 可丢弃的小部件仍是树的一部分

7cwmlq89  于 6个月前  发布在  Flutter
关注(0)|答案(1)|浏览(75)

我尝试理解两个有状态小部件之间的行为。我有一个简单的视图,每个项目都是一个ItemTest。我在ItemTestState中创建了一个属性,该属性在InitState()中使用widget.item初始化。使用此代码,当尝试删除一个项目时,我得到了“Dismissible widget is still part of the tree”,我不知道为什么。

class DismissibleExample extends StatefulWidget {
  const DismissibleExample({super.key});

  @override
  State<DismissibleExample> createState() => _DismissibleExampleState();
}

class _DismissibleExampleState extends State<DismissibleExample> {
  List<int> items = List<int>.generate(100, (int index) => index);

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: items.length,
      padding: const EdgeInsets.symmetric(vertical: 16),
      itemBuilder: (BuildContext context, int index) {
        return ItemTest(
            item: items[index],
            onDismissed: () {
              setState(() {
                items.removeAt(index);
              });
            },
        );
      },
    );
  }
}

class ItemTest extends StatefulWidget {
  const ItemTest({
    super.key,
    required this.item,
    required this.onDismissed,
  });

  final int item;
  final Function() onDismissed;

  @override
  State<ItemTest> createState() => _ItemTestState();
}

class _ItemTestState extends State<ItemTest> {
  int item = 0;

  @override
  void initState() {
    item = widget.item;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Dismissible(
      background: Container(
        color: Colors.green,
      ),
      key: ValueKey<int>(item),
      onDismissed: (direction) {
        widget.onDismissed();
      },
      child: ListTile(
        title: Text(
          'Item $item',
        ),
      ),
    );
  }
}

字符串


的数据
谢谢你的帮助

kmpatx3s

kmpatx3s1#

您面临的问题是由于您在Dismissible widget中处理key的方式造成的。
你在initState()方法中使用widget.item初始化item。当小部件重新生成时,此值不会更新。

return Dismissible(
      background: Container(
        color: Colors.green,
      ),
      key: ValueKey<int>(widget.item),
      onDismissed: (direction) {
        widget.onDismissed();
      },
      child: ListTile(
        title: Text(
          'Item $item',
        ),
      ),
    );

字符串

相关问题