위젯을 확장하는 것이 정말 반 패턴입니까?

Aug 20 2020

Flutter 위젯을 확장하는 것이 반 패턴이라는 것을 몇 군데 읽었습니다 . 사실인가요?

나는 위젯 서브 클래 싱을 사용하여 내가 제거하고있는 위젯을 서브 클래 싱하고 그 위젯을 생성자에 넣음으로써 중첩을 줄였다.

class Foo extends FormBuilder {
    Foo() : super (
        // bunch of widgets here
    );
}

상태 비 저장 위젯을 확장하는 것이 더 인기있는 것처럼 보이지만, 트리에 몇 줄의 코드와 위젯이 추가됩니다.

class Foo extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
    return FormBuilder(
       // bunch of widgets here
    );
}

함수에서 위젯을 반환하는 것은 렌더링 최적화를 중단 하기 때문에 반 패턴이라는 것을 읽었습니다 . 내 첫 번째 접근 방식도 마찬가지로 숨겨진 부작용이 있습니까? 즉, 정말 반 패턴입니까?

답변

3 kuhnroyal Aug 20 2020 at 20:22

상태 저장 위젯을 확장하면 상태가 수퍼 클래스에 입력되므로 문제가 발생할 수 있으며 대부분의 상태 클래스가 비공개로 유지되므로 상태를 확장 할 수 없습니다. 같은 많은 조회 방법 BuildContext.findAncestorStateOfType()이 잠재적으로 실패합니다.

상태 비 저장 위젯 확장은 대부분의 경우에 작동하지만 이미 발견 했으므로 권장되지 않습니다.

일반적으로 Flutter의 전체 반응 및 위젯 특성과 관련하여 상속보다 구성 의 원칙은 따라야 할 좋은 패턴입니다.

위젯을 새 위젯으로, 새 위젯을 새 위젯으로 새 위젯으로 구성합니다. 요점을 알 수 있습니다.

그 외에도 대부분 자동 생성되는 2 줄의 코드를 저장하지만 VSCode / IntelliJ의 "패딩이있는 래핑 위젯"과 같은 간단한 도우미를 모두 제거합니다. FormBuilder앱의 모든 용도에 패딩으로 확장을 래핑하는 것이 훨씬 더 어렵습니다 . 작성이 간단하다면 안에 포장하십시오 Foo. 테마, 색상, 글꼴 스타일 등에 사용하는 다른 모든 위젯에도 동일하게 적용됩니다. 패딩은 예일뿐입니다.

2 jitsm555 Aug 20 2020 at 21:16

떨림은 그 이상입니다 composition보다는 Inheritance. 그러나 StatelessWidget을 사용한 상속은 부모 위젯을 자식에서 재사용해야 할 때 항상 유용합니다.

예 :

class FormBuilder extends StatelessWidget {
  Widget getWidget() {
    return Text('Child Text');
  }

  @override
  Widget build(BuildContext context) {
    return Text('FormBuilder Text');
  }
}

class Foo extends FormBuilder {
  Foo() : super();

  @override
  Widget build(BuildContext context) {
    return getWidget();
  }
}

따라서 Foo () 위젯을 호출 할 위젯은 위젯 요소 트리가 될 것입니다.

-푸

-컨테이너

정상적인 구성이라면 요소 트리는 이것에 대한 것입니다.

class Foo extends StatelessWidget {
      Foo() : super();
    
      @override
      Widget build(BuildContext context) {
        return FormBuilder();
      }
    }

-푸

-FormBuilder

-텍스트

나쁜 패턴을 말하는 공식 문서는 없지만 Composition염두에두고 설계된 플러터 . 그래서 개인적으로 상속과 관련하여 그러한 성능이나 지연 문제를 본 적이 없으므로 Inheritance그것을 사용하는 것이 나쁜 선택이 아니라고 제안 합니다.