首页 > 解决方案 > 如果参数为空,则使用默认值

问题描述

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

代码块

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);
});

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

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

标签: flutterdart

解决方案


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

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

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

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

...
          child: BlockPicker(
            ...
            availableColors: availableColors ?? defaultAvailableColors,
            ...
          ),  
...

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


推荐阅读