如何创建自定义FormField与对象初始化?

时间:2020-07-17 21:48:48

标签: flutter dart

我正在尝试创建一个DatePicker小部件以在开始日期和结束日期之间进行选择;这些字段存储在DateRange类中。初始化表单字段时,我还需要初始化DateRange对象,以便可以访问开始日期字段和结束日期字段。但是,由于它是一个自定义对象,因此无法初始化initialValue构造函数中的FormField字段。我可以通过一种方法进行初始化,以便在调用超类之前将其分配给initialValue吗?

import 'package:flutter/material.dart';

class DateRange {
  DateTime start;
  DateTime end;

  DateRange({this.start, this.end});
}

class DatePicker extends FormField<DateRange> {
  final ValueChanged<DateRange> onChanged;

  DatePicker(
    BuildContext context, {
    Key key,
    FormFieldSetter<DateRange> onSaved,
    FormFieldValidator<DateRange> validator,
    this.onChanged,
    DateRange initialValue,   /// I would like to do: initialValue = DateRange(), but it doesn't work.
    bool autovalidate = false,
    bool enabled = true,
  }) : super(
    onSaved: onSaved,
    validator: validator,
    initialValue: initialValue,
    autovalidate: autovalidate,
    enabled: true,
    builder: (FormFieldState<DateRange> state) {
      return Container();    /// Where the implementation is
    });
}

1 个答案:

答案 0 :(得分:0)

我看到两个选项,但是其中一个可能无法使用,具体取决于您的实现。

选项1-而是在初始化列表中创建DateRange

class DatePicker extends FormField<DateRange> {
  final ValueChanged<DateRange> onChanged;

  DatePicker(
    BuildContext context, {
    Key key,
    FormFieldSetter<DateRange> onSaved,
    FormFieldValidator<DateRange> validator,
    this.onChanged,
    DateRange initialValue,
    bool autovalidate = false,
    bool enabled = true,
  }) : super(
    onSaved: onSaved,
    validator: validator,
    initialValue: initialValue ?? DateRange(),
    autovalidate: autovalidate,
    enabled: true,
    builder: (FormFieldState<DateRange> state) {
      return Container();
    });
}

选项2-使DateRange成为const的构造函数:

class DateRange {
  final DateTime start;
  final DateTime end;

  const DateRange({this.start, this.end});
}

class DatePicker extends FormField<DateRange> {
  final ValueChanged<DateRange> onChanged;

  DatePicker(
    BuildContext context, {
    Key key,
    FormFieldSetter<DateRange> onSaved,
    FormFieldValidator<DateRange> validator,
    this.onChanged,
    DateRange initialValue = const DateRange(),
    bool autovalidate = false,
    bool enabled = true,
  }) : super(
    onSaved: onSaved,
    validator: validator,
    initialValue: initialValue,
    autovalidate: autovalidate,
    enabled: true,
    builder: (FormFieldState<DateRange> state) {
      return Container();
    });
}

无论哪种方式,我都无法真正找到执行您所要求的理由。应将initialValue参数设置为null(因此,不应分配默认值),并且应授予DateRange的用户完全控制权。如果您的应用程序使用此实现更好/代码更简洁,那么您当然可以采用这种方式。