StatefulWidget 대 StatelessWidget.
StatelessWidget- 변경 가능한 상태가 필요하지 않은 위젯입니다.
상태 비 저장 위젯은 사용자 인터페이스를보다 구체적으로 설명하는 다른 위젯 집합을 구축하여 사용자 인터페이스의 일부를 설명하는 위젯입니다. 빌드 프로세스는 사용자 인터페이스의 설명이 완전히 구체화 될 때까지 반복적으로 계속됩니다 (예 : 구체적인 RenderObject를 설명하는 RenderObjectWidgets로 완전히 구성됨).
stateless
당신이 설명하는 인터페이스를 사용자의 부분은 객체 자체와의 구성 정보 이외에 의존하지 않을 때 위젯 유용
BuildContext 위젯이 팽창되는. 내부 클럭 구동 상태가 있거나 일부 시스템 상태에 따라 동적으로 변경 될 수있는 컴포지션의 경우를 사용하는 것이
StatefulWidget
좋습니다.
class GreenFrog extends StatelessWidget {
const GreenFrog({ Key key }) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(color: const Color(0xFF2DBD3A));
}
}
StatefulWidget- 변경 가능한 상태를 가진 위젯.
- 상태 저장 위젯은 설명하는 사용자 인터페이스의 일부가 동적으로 변경 될 수있는 경우에 유용합니다.
Flutter가를 만들 때 StatefulWidget
State 객체를 만듭니다. 이 객체는 해당 위젯의 모든 변경 가능 상태가 유지되는 곳입니다.
상태의 개념은 다음 두 가지로 정의됩니다.
1) 위젯에서 사용하는 데이터가 변경 될 수 있습니다.
2) 위젯이 빌드 될 때 데이터를 동 기적으로 읽을 수 없습니다. (모든 상태는 빌드 메서드가 호출 될 때까지 설정되어야합니다).
StatefulWidget 수명주기
수명주기에는 다음과 같은 단순화 된 단계가 있습니다.
- createState () -Flutter가 StatefulWidget을 빌드하라는 지시를 받으면 즉시
createState()
.
@override
_MyState createState() => _MyState();
- mount == true- 모든 위젯에 bool
this.mounted
속성이 있습니다. buildContext
가 할당 되면 참 이됩니다. setState
위젯이 마운트 해제 될 때 호출하는 것은 오류 입니다. 이 State 개체가 현재 트리에 있는지 여부입니다.
State 객체를 생성 한 후를 호출하기 전에 initState
프레임 워크는 State 객체를
BuildContext
. State 객체는 프레임 워크가를
호출 할 때까지 마운트 된 상태로 유지되며 그 dispose()
이후에는 프레임 워크가
State 객체에 다시 빌드를 요청하지 않습니다 .
mount가 true가 아니면 setState를 호출하는 것은 오류입니다.
bool get mounted => _element != null;
- initState () -위젯이 생성 될 때 호출되는 첫 번째 메서드입니다 (물론 클래스 생성자 이후).
initState
한 번만 호출됩니다. 전화해야합니다super.initState().
위젯의 생성 된 인스턴스에 대한 특정 BuildContext에 의존하는 데이터를 초기화합니다.
트리에서 이러한 위젯 '부모'에 의존하는 속성을 초기화합니다.
ChangeNotifiers
이 위젯의 데이터를 변경할 수있는 Streams, 또는 기타 개체를 구독합니다 .
@override
initState() {
super.initState();
cartItemStream.listen((data) {
_updateWidget(data);
});
}
- didChangeDependencies () -이 State 객체의 종속성이 변경 될 때 호출됩니다.
이 메서드는 initState
. BuildContext.inheritFromWidgetOfExactType
이 메서드에서 호출 하는 것이 안전합니다 .
프레임 워크는 종속성 변경 후 항상 빌드를 호출하기 때문에 서브 클래스는이 메서드를 거의 재정의하지 않습니다. 일부 하위 클래스는 종속성이 변경 될 때 비용이 많이 드는 작업 (예 : 네트워크 가져 오기)을 수행해야하고이 작업이 모든 빌드에 대해 수행하기에는 너무 비싸기 때문에이 메서드를 재정의합니다.
@protected
@mustCallSuper
void didChangeDependencies() { }
- build () -위젯이 나타내는 사용자 인터페이스의 일부를 설명합니다.
프레임 워크는 다양한 상황에서이 메서드를 호출합니다.
- 전화 후
initState
.
- 전화 후
didUpdateWidget
.
- 로 전화를받은 후
setState
.
- 이 State 개체의 종속성이 변경된 후 (예 : 이전 빌드 변경에서 참조 된 InheritedWidget).
- 비활성화를 호출 한 후 다른 위치의 트리에 State 개체를 다시 삽입합니다.
프레임 워크는이 메서드에서 반환 된 위젯이 기존 하위 트리의 루트를 업데이트 할 수 있는지 여부에 따라 기존 하위 트리를 업데이트하거나 하위 트리를 제거하고 새 하위 트리를 확장하여이 위젯 아래의 하위 트리를이 메서드에서 반환 된 위젯으로 바꿉니다. 를 호출하여 결정됩니다
Widget.canUpdate
.
일반적으로 구현은이 위젯의 생성자, 지정된 BuildContext 및이 State 객체의 내부 상태의 정보로 구성된 새로 생성 된 위젯 집합을 반환 합니다.
@override
Widget build(BuildContext context, MyButtonState state) {
... () { print("color: $color"); } ...
}
- didUpdateWidget () -위젯 구성이 변경 될 때마다 호출됩니다.
상위 위젯이 동일한 런타임 유형 및 Widget.key를 가진 새 위젯을 표시하도록 트리의이 위치 업데이트를 다시 빌드하고 요청하는 경우 프레임 워크는이 State 개체의 위젯 속성을 업데이트하여 새 위젯을 참조한 다음이를 호출합니다. 이전 위젯을 인수로 사용하는 메서드.
위젯이 변경 될 때 (예 : 암시 적 애니메이션 시작) 응답하도록이 메서드를 재정의합니다.
프레임 워크는 항상 didUpdateWidget을 호출 한 후 build를 호출합니다. 즉, didUpdateWidget의 setState에 대한 모든 호출이 중복됩니다.
@mustCallSuper
@protected
void didUpdateWidget(covariant T oldWidget) { }
- setState ()-State 객체의 내부 상태를 변경할 때마다 전달하는 함수를 변경합니다
setState
.
setState를 호출 하면이 개체의 내부 상태가이 하위 트리의 사용자 인터페이스에 영향을 줄 수있는 방식으로 변경되었음을 프레임 워크에 알립니다. 이로 인해 프레임 워크는
이 State 개체에 대한 빌드를 예약 합니다.
setState 를 호출하지 않고 상태를 직접 변경하면 프레임 워크가 빌드를 예약하지 않을 수 있으며이 하위 트리의 사용자 인터페이스가 새 상태를 반영하도록 업데이트되지 않을 수 있습니다.
setState(() { _myState = newValue });
- deactivate () -Deactivate는 State가 트리에서 제거 될 때 호출되지만 현재 프레임 변경이 완료되기 전에 다시 삽입 될 수 있습니다. 이 방법은 기본적으로 State 객체를 트리의 한 지점에서 다른 지점으로 이동할 수 있기 때문에 존재합니다.
- 프레임 워크는 트리에서이 State 개체를 제거 할 때마다이 메서드를 호출합니다. 어떤 경우에는 프레임 워크가 State 객체를 트리의 다른 부분에 다시 삽입합니다 (예 :이 State 객체를 포함하는 하위 트리가 트리의 한 위치에서 다른 위치로 접목 된 경우). 이 경우 프레임 워크는 빌드를 호출하여 State 개체가 트리의 새 위치에 적응할 수있는 기회를 제공하도록합니다. 프레임 워크가이 하위 트리를 다시 삽입하면 하위 트리가 트리에서 제거 된 애니메이션 프레임이 끝나기 전에 삽입됩니다. 이러한 이유로 State 개체는 프레임 워크가 해당 dispose 메서드를 호출 할 때까지 대부분의 리소스 해제를 연기 할 수 있습니다.
이것은 거의 사용되지 않습니다.
@protected
@mustCallSuper
void deactivate() { }
- dispose () -이 객체가 트리에서 영구적으로 제거 될 때 호출됩니다.
프레임 워크는이 State 개체가 다시 빌드되지 않을 때이 메서드를 호출합니다. 프레임 워크 호출 후dispose()
State 객체는 마운트 해제 된 것으로 간주되고 마운트 된 속성은 false입니다. 이 시점에서 setState를 호출하는 것은 오류입니다. 이 수명주기 단계는 최종 단계입니다. 폐기 된 상태 개체를 다시 탑재 할 방법이 없습니다.
서브 클래스는이 객체가 보유한 모든 리소스를 해제하기 위해이 메서드를 재정의해야합니다 (예 : 활성 애니메이션 중지).
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() { _debugLifecycleState = _StateLifecycle.defunct; return true; }());
}
자세한 내용 은 여기 , 여기 로 이동 하십시오.