수명주기 위젯에서 플러터

머리말

그리고 등이 수명주기에서보기 위젯 플러터로 안드로이드 활동보기와 같은 다른 프레임 워크, 라이프 사이클 콜백은 이제 위의 국가를 넣어. 수명주기의 떨림 이해, 우리를 합리적인 제어가 필수적이다 물품. 조립을 마친 상태 라이프 사이클은 다음과 같이 :


730571-7ac148f75dac52dc.png
위젯 라이프 사이클

대략 세 단계는 다음과 같이 볼 수있다

  • 초기화 (삽입 렌더링 트리)
  • (렌더링 트리에 존재하는) 상태 변화
  • 파괴 (렌더링 트리에서 제거)

생성자

생성자의 위젯 속성이 작동하지 않습니다에 액세스하려면이 시간 위젯 속성의 상태가 비어 있기 때문에이 기능은 수명주기의 일부가 아닙니다. 하지만 생성자는 첫 번째 통화를해야합니다.

initState

///이 객체가 삽입 될 때 호출 트리.
호출 할 때 렌더 트리를 삽입 할 때,이 기능은 한 번만 수명주기라고합니다. 여기에는 초기화 상태 변수로, 일부 초기화 할 수 있습니다.

didChangeDependencies

/// 호출 할 때 [주] 개체 변경 종속성.

730571-20861d4ab29fd2e2.png
didChangeDependencies

이 기능 initState 즉시 호출 후 BuildContext.inheritFromWidgetOfExactType 호출 할 수 있습니다, 사용 시나리오는 무엇 BuildContext.inheritFromWidgetOfExactType 다음인가? 가장 고전적인 시나리오는

new DefaultTabController(length: 3, child: new TabBar(
      tabs: [ "主页","订单","我的" ]
      .map( (data)=>new Text(data) ).toList(),

TabBar의는 tabController를 정의해야하지만 외부 슬리브 층의 DefaultTabController은 봐 TabContrller를 정의하는 소스 필요가 없습니다 :

@override
  void didChangeDependencies() {
    super.didChangeDependencies();
    _updateTabController();
    _initIndicatorPainter();
  }

void _updateTabController() {
    final TabController newController = widget.controller ?? DefaultTabController.of(context);

(컨텍스트) DefaultTabController.of 여기에 주목

 static TabController of(BuildContext context) {
    final _TabControllerScope scope = context.inheritFromWidgetOfExactType(_TabControllerScope);
    return scope?.controller;
  }

사실 BuildContext.inheritFromWidgetOfExactType 전화, 그것은 didChangeDependencies에서 말했다, 당신은 구성 요소에서 데이터를 얻을 수 있습니다.

didUpdateWidget

/// 때마다 위젯 구성이 변경 될 때 호출됩니다.

730571-a14342ad30917329.png
didUpdateWidget

변화의 구성 요소의 상태는 didUpdateWidget, 전화 setState를 등. 호출 할 때
떨림 프레임 워크는이 상태의 결합, 새로운 위젯을 만들고 여기에 사실을,이 기능에 기존의 위젯을 전달합니다.
이 기능은 일반적으로 속성이 변경되는보고, 신규 및 이전 위젯 비교하는 데 사용되며, 국가는 약간의 조정을 할 수 있습니다.
이 컨트롤러에 관련된 변경 사항, 청취자가 이전 컨트롤러가이 기능에 제거하고, 새로운 컨트롤러의 청취를 만들 필요가 있음을 주목해야한다.
730571-747ae1402257aaca.png
TabBar_didUpdateWidget

730571-9183d3eba4bd824c.png
_updateTabController

비활성화

///이 객체는 트리에서 제거 될 때 호출합니다.

처분하기 전에, 우리는이 함수를 호출합니다.

처분

이 객체가 영구적으로 트리에서 제거 될 때 /// 호출합니다.

이 단계 후에 파괴하는 방법에 대한 구성 요소,이 함수는 환경을 정리, 일반적으로 모니터를 제거합니다.
또는 TabBar의 :


730571-12b50b00e6813a82.png
처분

실제 현장

우리가 페이지 B에 페이지 A에서 뛰어 가정하면, 다음 A, B 페이지 수명주기는 같은 것인가?

페이지가 작동 모드로로드 이번에 생성자> initState> didChangeDependencies> 위젯 빌드 : B 초기화 상태 페이지가 순차적으로 네 가지 기능을 수행한다.
이 시간에서 수행 비활성화 페이지 순차적> 기능을 구축. 언로드되지 않은이 시간에 페이지를 참고.

그리고 우리가 한 페이지의 B 버튼이 있다고 가정, 버튼 B 페이지를 클릭 버튼의 텍스트를 변경하는 방법은 (이론적으로도 didUpdateWidget을 수행해야합니다,하지만 난이없는), 위젯을 구축 수행한다.

이 때, 우리는 페이지 B의 페이지를 반환 뒤로 버튼을 클릭합니다.
페이지 다시 표시, B 페이지 하역을 시작합니다.
이어서 제 구현은 비활성화> 다음 페이지 B가 실행 한 후, 구축 : 비활성화> 폐기.
이 때, 페이지 A를로 작동 모드는 B 페이지를 제거합니다.

요약하면

호출 setState를 지원 여부
생성자 1 아니오
initState 1 잘못된 (setState를 사용하고 동일한을 사용하지 않음)
didChangeDependencies > = 1 잘못된
didUpdateWidget > = 1 그것은이다
비활성화 > = 1 아니오
처분 1 아니오

HTTPS : //www.jianshu.com/p/762bb2b7fa00 재현

추천

출처blog.csdn.net/weixin_34072857/article/details/91060905