dart Flutter:copyWith构造函数无法正常工作

jslywgbw  于 2023-10-13  发布在  Flutter
关注(0)|答案(1)|浏览(182)

在Flutter中,我有以下类:

class ContainerCardData {
  ContainerCardData({
    this.width,
    this.height,
    this.elevation = 4,
    this.gradientColors = const [Colors.blue],
    LinearGradient? gradient,
    BorderRadius? borderRadius,
    this.child,
  })  : borderRadius = borderRadius ?? BorderRadius.circular(10),
// getDefaultGradient is a function that returns a gradient (which is perfectly valid)
        gradient = gradient ?? getDefaultGradient(gradientColors);

我用这个copyWith方法将值传递给构造函数:

ContainerCardData copyWith({
    double? width,
    double? height,
    double? elevation,
    List<Color>? gradientColors,
    LinearGradient? gradient,
    BorderRadius? borderRadius,
    Widget? child,
  }) =>
      ContainerCardData(
        width: width ?? this.width,
        height: height ?? this.height,
        elevation: elevation ?? this.elevation,
        gradientColors: gradientColors ?? this.gradientColors,
        gradient: gradient ?? this.gradient,
        borderRadius: borderRadius ?? this.borderRadius,
        child: child ?? this.child,
      );

我的问题是,无论我为gradientColors传递什么值,getDefaultGradient总是接收默认值(本例中为Colors.blue)

这怎么可能,当我传递有效值给它的时候。
当我打印时:

final containerCardData = ContainerCardData(
      gradientColors: [Colors.orange],
      height: 92,
      elevation: 4,
      borderRadius: tileBorder,
    );
    
  final x = containerCardData.copyWith(
    gradientColors: [Colors.green],
  );
  
  // x.gradientColors -> The values I passed
  // x.gradient -> the default colors!
  print(
    '1) ${containerCardData.gradientColors} => ${containerCardData.gradient?.colors}');
  print('2) ${x.gradientColors} => ${x.gradient?.colors}');

输出

flutter: 1) [MaterialColor(primary value: Color(0xff2196f3))] => [MaterialColor(primary value: Color(0xff2196f3)), Color(0xff4dabf5)]

flutter: 2) [MaterialColor(primary value: Color(0xff4caf50))] => [MaterialColor(primary value: Color(0xff2196f3)), Color(0xff4dabf5)]

为什么渐变总是使用默认的gradientColors

谢谢你,谢谢

vngu2lb8

vngu2lb81#

copyWith()用于用new覆盖赋值。
这意味着如果你有x,其中A=1,B=1,C=1是默认构造的,并且想要x,其中A=1,B=2,C=1。你就可以用(B=2)来实现它。
你的覆盖实现也Assert,但你没有传递新的值给梯度,因此没有覆盖。
所以,如果你这样做:

final x = containerCardData.copyWith(
    gradientColors: [Colors.green],
gradient: LinearGradient(
//pass new values
),
  );

应该工作!

相关问题