Nó cũng quan trọng đối với mixins (và vì điều đó đối với bạn )
Đó là một mô hình trong khung Flutter để gọi siêu phương thức khi ghi đè các phương thức vòng đời trong a State. Đây là lý do tại sao thậm chí deactivatecó một mustCallSuperchú thích .
Ngoài ra , một số người mixinmong đợi rằng bạn gọi siêu phương thức của các phương thức vòng đời đó tại một điểm cụ thể trong hàm.
Điều này có nghĩa là bạn nên làm theo tài liệu và gọi super.dispose vào cuốidispose phương thức của bạn vì mixins Statetrong khung mong đợi rằng đây là trường hợp.
Ví dụ: TickerProviderStateMixinvà khẳng định ở cuối:SingleTickerProviderStateMixin super.dispose
Tất cả các Vé phải [..] được xử lý trước khi gọi super.dispose ().
Một ví dụ khác: AutomaticKeepAliveMixinthực thi logic trong initStatevà dispose.
Phần kết luận
Bắt đầu initStatevớisuper.initState và kết thúc disposevớisuper.dispose nếu bạn muốn ở bên dễ dàng và an toàn khi thêm mixins vào State.
Hơn nữa, hãy làm theo tài liệu cho các phương thức vòng đời khác (bất kỳ phương thức nào bạn ghi đè lên State) bởi vì khung sẽ mong đợi bạn gọi các siêu phương thức như được mô tả trong tài liệu.
Vì vậy, sau đây là những gì bạn nên làm:
void initState() {
super.initState();
//DO OTHER STUFF
}
Tuy nhiên, nó không thực sự quan trọng State, điều mà tôi sẽ giải thích trong phần sau và thậm chí cho mixins, nó chỉ quan trọng đối với các xác nhận đánh giá từ những gì tôi có thể tìm thấy - vì vậy nó sẽ không ảnh hưởng đến ứng dụng sản xuất của bạn.
Nó không quan trọng State
Tôi nghĩ rằng hai câu trả lời trước của Pablo Barrera và CopsOnRoad là sai lệch vì sự thật của vấn đề là nó thực sự không quan trọng và bạn không cần phải tìm đâu xa.
Các hành động duy nhất super.initStatevà super.disposethực hiện trong Statechính lớp đó là các xác nhận và vì assert-statements chỉ được đánh giá trong chế độ gỡ lỗi , nên hoàn toàn không quan trọng khi xây dựng ứng dụng của bạn, tức là trong chế độ sản xuất.
Sau đây, tôi sẽ hướng dẫn bạn làm gì super.initStatevà super.disposelàm gì State, đó là tất cả các mã sẽ được thực thi khi bạn không có thêm mixin nào.
initState
Chúng ta hãy xem chính xác mã nào được thực thi trong super.initState( nguồn ) đầu tiên :
@protected
@mustCallSuper
void initState() {
assert(_debugLifecycleState == _StateLifecycle.created);
}
Như bạn có thể thấy, chỉ có một xác nhận vòng đời và mục đích của nó là để đảm bảo rằng widget của bạn hoạt động chính xác. Vì vậy, miễn là bạn gọi super.initState một nơi nào đó của riêng initStatebạn, bạn sẽ thấy AssertionErrornếu tiện ích của bạn không hoạt động như dự định. Sẽ không có vấn đề gì nếu bạn thực hiện một số hành động trước bởi vì điều assertnày chỉ có nghĩa là báo cáo rằng có gì đó trong mã của bạn là sai và bạn sẽ thấy điều đó ngay cả khi bạn gọi super.initStatevào cuối phương thức của mình.
dispose
Các disposephương pháp tương tự ( nguồn ):
@protected
@mustCallSuper
void dispose() {
assert(_debugLifecycleState == _StateLifecycle.ready);
assert(() {
_debugLifecycleState = _StateLifecycle.defunct;
return true;
}());
}
Như bạn có thể thấy, nó cũng chỉ chứa các xác nhận xử lý kiểm tra vòng đời gỡ lỗi . Cách thứ hai assertở đây là một mẹo hay vì nó đảm bảo rằng _debugLifecycleStatechỉ được thay đổi trong chế độ gỡ lỗi (vì các thay đổi assertchỉ được thực hiện trong chế độ gỡ lỗi).
Điều này có nghĩa là miễn là bạn gọi super.dispose một nơi nào đó trong phương thức của riêng bạn, bạn sẽ không mất bất kỳ giá trị nào nếu không có thêm các chức năng bổ sung.