我正在尝试创建一个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
});
}
答案 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
的用户完全控制权。如果您的应用程序使用此实现更好/代码更简洁,那么您当然可以采用这种方式。