Я пытаюсь изменить поведение UnderlineInputBorder во Flutter, расширив его. Но Flutter всегда вызывал метод draw () суперкласса (UnderlineInputBorder) вместо моего _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());
    }
  }
3
Linh 1 Ноя 2018 в 07:29

1 ответ

Лучший ответ

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(), но они не были вызваны в вашем простом примере. Вам также необходимо переопределить их, чтобы создать все сценарии.

3
Günter Zöchbauer 5 Ноя 2018 в 20:08