위젯을 확장하는 것이 정말 반 패턴입니까?
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
);
}
함수에서 위젯을 반환하는 것은 렌더링 최적화를 중단 하기 때문에 반 패턴이라는 것을 읽었습니다 . 내 첫 번째 접근 방식도 마찬가지로 숨겨진 부작용이 있습니까? 즉, 정말 반 패턴입니까?
답변
상태 저장 위젯을 확장하면 상태가 수퍼 클래스에 입력되므로 문제가 발생할 수 있으며 대부분의 상태 클래스가 비공개로 유지되므로 상태를 확장 할 수 없습니다. 같은 많은 조회 방법 BuildContext.findAncestorStateOfType()
이 잠재적으로 실패합니다.
상태 비 저장 위젯 확장은 대부분의 경우에 작동하지만 이미 발견 했으므로 권장되지 않습니다.
일반적으로 Flutter의 전체 반응 및 위젯 특성과 관련하여 상속보다 구성 의 원칙은 따라야 할 좋은 패턴입니다.
위젯을 새 위젯으로, 새 위젯을 새 위젯으로 새 위젯으로 구성합니다. 요점을 알 수 있습니다.
그 외에도 대부분 자동 생성되는 2 줄의 코드를 저장하지만 VSCode / IntelliJ의 "패딩이있는 래핑 위젯"과 같은 간단한 도우미를 모두 제거합니다. FormBuilder
앱의 모든 용도에 패딩으로 확장을 래핑하는 것이 훨씬 더 어렵습니다 . 작성이 간단하다면 안에 포장하십시오 Foo
. 테마, 색상, 글꼴 스타일 등에 사용하는 다른 모든 위젯에도 동일하게 적용됩니다. 패딩은 예일뿐입니다.
떨림은 그 이상입니다 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
그것을 사용하는 것이 나쁜 선택이 아니라고 제안 합니다.