【问题标题】:How to create custom FormField initialize with object?如何使用对象创建自定义 FormField 初始化?
【发布时间】:2020-11-07 17:53:38
【问题描述】:

我正在尝试创建一个DatePicker 小部件以在开始日期和结束日期之间进行选择;这些字段存储在DateRange 类中。在初始化表单字段时,我还需要初始化 DateRange 对象,以便我可以访问开始日期字段和结束日期字段。但是,由于它是一个自定义对象,我无法在 FormField 构造函数中初始化 initialValue 字段。有没有办法让我初始化,以便在调用超类之前将其分配给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
    });
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    我看到了两个选项,但根据您的实施,其中一个可能不起作用。

    选项 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 的用户应完全控制它。如果您的应用程序在此实现中更好/代码更简洁,您当然可以保持这种方式。

    【讨论】:

    • 如果initialValue为null,我想初始化DateRange的原因是因为我需要在我的实现中访问DateRange的开始和结束变量,这样我就可以避免调用那些未初始化的DateRange 上的字段。感谢您的解决方案。
    猜你喜欢
    • 2019-11-28
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多