如果参数为空则使用默认值

Ekr*_*gal 6 dart flutter

如何才能更正确地编写下图中标记的代码块。我的目标是如果availableColors变量为 null ,则将默认值发送到参数。

代码块

showDialog<Color>(
  context: context,
  builder: (BuildContext context) {
    return OrientationBuilder(
      builder: (context, orientation) {
        return ResponsiveDialog(
          context: context,
          title: title,
          headerColor: headerColor,
          headerTextColor: headerTextColor,
          backgroundColor: backgroundColor,
          buttonTextColor: buttonTextColor,
          child: availableColors == null ? BlockPicker(
            pickerColor: selectedColor,
            onColorChanged: (color) => selectedColor = color,
          ): BlockPicker(
            pickerColor: selectedColor,
            availableColors: availableColors,
            onColorChanged: (color) => selectedColor = color,
          ),  
          okPressed: () => Navigator.of(context).pop(selectedColor),
        );
      },
    );
  },
).then((selection) {
  if (onChanged != null && selection != null) onChanged(selection);
});
Run Code Online (Sandbox Code Playgroud)

我无法更改 BlockPicker。它来自外部库。

class BlockPicker extends StatefulWidget {
  const BlockPicker({
    @required this.pickerColor,
    @required this.onColorChanged,
    this.availableColors = _defaultColors,
    this.layoutBuilder = defaultLayoutBuilder,
    this.itemBuilder = defaultItemBuilder,
  });
Run Code Online (Sandbox Code Playgroud)

jam*_*lin 7

不幸的是,在调用函数时,Dart 没有提供有条件地使用其默认参数的好方法。(至少有一种语言提案可以提供这样的机制。)

一般来说,您通常必须复制函数的默认参数(并希望它不会改变)。

在这种情况下,BlockPicker不允许您直接执行此操作,因为它的默认值availableColors是私有的。但是,它的availableColors属性是公共的,因此您可以构造一个虚拟对象BlockPicker并提取它使用的默认值。例如:

final defaultAvailableColors =
    BlockPicker(
      pickerColor: Colors.black,
      onColorChanged: (_) {},
    ).availableColors;

...
          child: BlockPicker(
            ...
            availableColors: availableColors ?? defaultAvailableColors,
            ...
          ),  
...
Run Code Online (Sandbox Code Playgroud)

从长远来看,我会提出一个问题BlockPicker,并要求将默认值公开或者在参数为 时使用它们null