扩展Google Flutter中的UnderlineInputBorder类

时间:2018-11-01 04:29:02

标签: dart flutter

我正在尝试通过扩展Flutter来修改UnderlineInputBorder的行为。 但是Flutter总是调用超类(UnderlineInputBorder)的draw()方法,而不是下面的_PremiseInputBorder

TextField小部件的代码:

TextField(
      decoration: InputDecoration(
          contentPadding: EdgeInsets.zero, 
          border: _PremiseInputBorder()),
      )

我的自定义边框类的代码:

class _PremiseInputBorder extends UnderlineInputBorder {
  const _PremiseInputBorder() : super();

  @override
  void paint(Canvas canvas, Rect rect, {
    double gapStart,
    double gapExtent = 0.0,
    double gapPercentage = 0.0,
    TextDirection textDirection,}) {

    if (borderRadius.bottomLeft != Radius.zero ||     
      borderRadius.bottomRight != Radius.zero)
      canvas.clipPath(getOuterPath(rect, textDirection: textDirection));
      Offset leftRect = Offset(rect.left, rect.bottom - 5.0);
      Offset rightRect = Offset(rect.right, rect.bottom - 5.0);
      canvas.drawLine(leftRect, rightRect, borderSide.toPaint());
    }
  }

1 个答案:

答案 0 :(得分:3)

UnderlineInputBorder具有

@override
  UnderlineInputBorder copyWith({ BorderSide borderSide, BorderRadius borderRadius }) {
    return UnderlineInputBorder(
      borderSide: borderSide ?? this.borderSide,
      borderRadius: borderRadius ?? this.borderRadius,
    );
  }

即使您扩展该类,它也会返回UnderlineInputBorder

如果您添加到_PremiseInputBorder

  @override
  UnderlineInputBorder copyWith(
      {BorderSide borderSide, BorderRadius borderRadius}) {
    return _PremiseInputBorder();
  }

它将调用您的paint()方法。

还有其他方法可以执行类似的操作,例如scale()lerpFrom()lerpTo(),但在您的简单示例中并未调用它们。 您还需要覆盖它们以使其适用于所有情况。