Nó cũng quan trọng đối với mixin
s (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í deactivate
có một mustCallSuper
chú thích .
Ngoài ra , một số người mixin
mong đợ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ì mixin
s State
trong khung mong đợi rằng đây là trường hợp.
Ví dụ: TickerProviderStateMixin
và 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: AutomaticKeepAliveMixin
thực thi logic trong initState
và dispose
.
Phần kết luận
Bắt đầu initState
vớisuper.initState
và kết thúc dispose
vớisuper.dispose
nếu bạn muốn ở bên dễ dàng và an toàn khi thêm mixin
s 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.initState
và super.dispose
thực hiện trong State
chí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.initState
và super.dispose
là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 initState
bạn, bạn sẽ thấy AssertionError
nế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 assert
nà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.initState
vào cuối phương thức của mình.
dispose
Các dispose
phươ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 _debugLifecycleState
chỉ được thay đổi trong chế độ gỡ lỗi (vì các thay đổi assert
chỉ đượ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.