onDismissed 在 flutter 中改变了小部件的颜色

onDismissed in flutter changed color of widget

我的 Dismissible Widget 有问题。当您 运行 此代码时:

import 'dart:math';

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('appbar'),
        ),
        body: const MyStatefulWidgetState(),
      ),
    );
  }
}

class MyStatefulWidgetState extends StatefulWidget {
  const MyStatefulWidgetState({Key? key}) : super(key: key);

  @override
  _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<MyStatefulWidgetState> {
  final List<String> items = List<String>.generate(10, (i) => "Item ${i + 1}");

  @override
  Widget build(BuildContext context) {
    return ListView.separated(
      separatorBuilder: (BuildContext context, int index) => const Divider(
        height: 2,
      ),
      itemCount: items.length,
      itemBuilder: (context, index) {
        final item = items[index];
        return Dismissible(
          key: Key(item),
          onDismissed: (DismissDirection direction) {
            //Remove the item from the data source.
            setState(() {
              items.removeAt(index);
            });
          },
          child: Container(
            height: 90,
            alignment: Alignment.centerLeft,
            child: Padding(
              padding: const EdgeInsets.all(12.0),
              child: Text(item),
            ),
            color: UniqueColorGenerator.getColor(),
          ),
        );
      },
    );
  }
}

class UniqueColorGenerator {
  static Random random = Random();
  static Color getColor() {
    return Color.fromARGB(
        255, random.nextInt(255), random.nextInt(255), random.nextInt(255));
  }
}

并且当您关闭容器时,从列表中删除容器后,所有容器的颜色都会改变(例如重置应用程序或热重新加载并获得新颜色)

1 - 为什么会这样?

2 - 我该如何解决这个问题?所以当我关闭容器时,其他容器的颜色保持相同的颜色?

谢谢

我对带键的 Flutter 优化不太了解,所以我不确定为什么你的键什么都不做但是根据我的理解,发生这种情况的原因是setState 调用。

setState 将导致构建函数再次为 运行,这反过来意味着 itemBuilder 函数必须再次为 运行,这意味着您要为每个容器生成一种新颜色计时 itemBuilder 函数 运行s(尽管它用于同一个项目),它解释了您所看到的行为。

现在要改变它,您可以采用不同的方式,此处描述了其中两种方式:

选项 1 - 根据项目生成颜色

Random 构造函数采用可选种子,允许您每次都重现一组给定的随机值。如果您使用项目的 hashCode,您仍然会为每个项目生成一个有效的随机颜色:

class UniqueColorGenerator {
  static Color getColor(String item) {
    final random = Random(item.hashCode);
    
    return Color.fromARGB(
        255, random.nextInt(255), random.nextInt(255), random.nextInt(255));
  }
}

然后将其用于 color: UniqueColorGenerator.getColor(item), 的容器颜色。这种方法的优点是(至少使用字符串作为项目)颜色即使在重新启动之间也是一致的。对于更复杂的对象,请确保覆盖 the hashCode getter!

选项 2 - 使颜色成为项目状态的一部分

为确保您不会丢失关于哪个项目有什么颜色的信息,请将其与项目一起存储。

首先,创建一个项目 class 将我们的数据整齐地放在一起:

class Item {
  final String text;
  final Color color;

  Item(this.text, this.color);
}

接下来,更新项目的生成以利用它 class:

final List<Item> items = List<Item>.generate(
  10,
  (i) => Item("Item ${i + 1}", UniqueColorGenerator.getColor())
);

最后,更新它的用法(所以 Container 的颜色变成 item.color,之前的 item 现在是 item.text)。

使用这种方法,颜色不会在整个重新启动过程中保留。