Flutter:showDatePicker:取消按钮是否可以使用替代文本?

时间:2019-05-28 11:52:41

标签: flutter

我有一个应用程序,其中日期字段可以是有效日期,也可以是null。我发现取消按钮的showDatePicker描述为“ cancel”,令人困惑。用户期望它做什么?这可能意味着没有变化,也可能没有日期。在我的情况下尤其如此,我希望它的意思是“无日期”。我已经复制了“ date_picker.dart”并进行了更改,以为“取消”按钮提供可选的替代文本。

我最初将date_picker.dart更改为允许多个按钮,单击“确定”以外的按钮将返回该按钮的文本。但是,那意味着要返回一个var(动态),我认为这可能是不可接受的。然后,我意识到仅更改“取消”按钮的文本就足够了,更改“ date_picker.dart”所需要做的就是为替代文本提供一个可选参数,以代替“取消”。仅涉及几行代码。更改非常简单。单击取消按钮将返回null。将取消按钮的文本更改为“无日期”将使结果对用户显而易见。

如果不更改程序就无法实现这一目标,那么我将请求在Github上进行更改。

在showDatePicker / date_picker.dart中,目前是否有任何方法可以实现取消按钮的替代文本?

1 个答案:

答案 0 :(得分:2)

showDatePicker给出一个模态,其子级为_DatePickerDialog类,其子级本身将localizations.cancelButtonLabel用作“取消”按钮标签。

我们可以通过基于原始英语本地化创建自定义本地化委托来覆盖cancelButtonLabel属性。

例如这是一个返回默认英语本地化的委托,但重新定义了cancelButtonLabel属性:

class CancelButtonLocalizationDelegate extends LocalizationsDelegate<MaterialLocalizations> {
  const CancelButtonLocalizationDelegate();

  @override
  bool isSupported(Locale locale) => locale.languageCode == 'en';

  @override
  Future<MaterialLocalizations> load(Locale locale) => Future.value(CancelButtonLocalization());

  @override
  bool shouldReload(CancelButtonLocalizationDelegate old) => false;
}

class CancelButtonLocalization extends DefaultMaterialLocalizations {
  const CancelButtonLocalization();

  @override
  String get cancelButtonLabel => 'Custom Cancel';
}

使用Localizations.override将更改应用于构建器中的日期选择器子项,例如

showDatePicker(
  context: context,
  // ...,
  builder: (context, child) {
    return Localizations.override(
      context: context,
      delegates: [
        CancelButtonLocalizationDelegate(),
      ],
      child: child,
    );
  }
);