代码之家  ›  专栏  ›  技术社区  ›  Doug Donohoe

颤振-子类小部件vs包装它[复制]

  •  1
  • Doug Donohoe  · 技术社区  · 8 年前

    class InputWithValidation extends StatelessWidget {
      InputWithValidation({this.fieldName, this.accessor});
    
      final String fieldName;
      final ModelAccessor accessor;
    
      Widget build(context) {
    
        var elem = FooDataDictionary.of(context).dataElement(fieldName);
    
        return Container(
            margin: EdgeInsets.all(inputMargin),
            child: TextFormField(
              keyboardType: elem.keyboardType,
              initialValue: elem.getAsString(accessor),
              autovalidate: true,
              validator: elem.validate,
              onSaved: (val) {
                elem.setFromString(accessor, val);
              },
              decoration: InputDecoration(
                hintText: FooLocalizations.of(context).hint(fieldName),
                labelText: FooLocalizations.of(context).label(fieldName)),
            ));
      }
    }
    

    我想重构这个来提取TextFormField,这样我就可以在其他地方重用它,而不必硬编码边距的使用。

    我的第一次尝试是写:

    class DataElementTextFormField extends TextFormField
    {
      final DataElement dataElement;
      final ModelAccessor accessor;
    
      DataElementTextFormField(this.dataElement, this.accessor) :
          super(
            keyboardType: dataElement.keyboardType,
            initialValue: dataElement.getAsString(accessor),
            autovalidate: true,
            validator: dataElement.validate,
            onSaved: (val) {
              dataElement.setFromString(accessor, val);
            },
            decoration: InputDecoration(
              hintText: FooLocalizations.of(context).hint(fieldName),
              labelText: FooLocalizations.of(context).label(fieldName)),
          );
    }
    

    然而 hintText / labelText BuildContext 以获得正确的本地化实例。这让我一时难以理解,因为我不确定是否有正确的方法来对这样的小部件进行子类化。

    所以我的问题有两个方面:

    1. 什么是子类的正确方法 StatefulWidget 并允许访问 构建上下文 ?
    1 回复  |  直到 8 年前
        1
  •  1
  •   Randal Schwartz    8 年前

    一般来说,组合优于继承,即使对于SDK的小部件也是如此。如果你继承,你真的需要深入到父类并确保你尊重所有的协议。使用composition,您可以简单地查看已发布的API,并遵循其中的规则。