我正在尝试通过扩展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());
}
}
答案 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()
,但在您的简单示例中并未调用它们。
您还需要覆盖它们以使其适用于所有情况。