Sự khác biệt giữa didChangeDependencies và initState là gì?


8

Tôi chưa quen với rung động và khi tôi muốn gọi ngữ cảnh của mình trong initState thì nó báo lỗi: đó là về BuildContext.inheritFromWidgetOfExactType nhưng sau đó tôi sử dụng didChangeDependencies và nó hoạt động chính xác.

bây giờ tôi có 2 câu hỏi:

1-tại sao chúng ta không thể gọi ngữ cảnh của mình trong initState nhưng không có vấn đề gì với didChangeDependencies? (vì như tôi đã đọc trong tài liệu chính thức This method is also called immediately after [initState]và cả hai sẽ được gọi trước khi xây dựng phương thức.)

2-tại sao chúng ta có quyền truy cập vào ngữ cảnh bên ngoài phương thức xây dựng (vì chúng ta có build(BuildContext context)và chúng ta có thể sử dụng bối cảnh của mình nhưng trong didChangeDependencies chúng ta không có bất cứ thứ gì như didChangeDependencies(BuildContext context)vậy, vậy từ đâu chúng ta có thể gọi ngữ cảnh để sử dụng nó)?

Câu trả lời:


9

Bối cảnh của một tiểu bang có sẵn cho chúng ta kể từ thời điểm Nhà nước tải các phụ thuộc của nó.

Tại thời điểm xây dựng được gọi, bối cảnh có sẵn cho chúng tôi và được thông qua như là một đối số.

Bây giờ tiếp tục, initstate được gọi trước khi trạng thái tải các phụ thuộc của nó và vì lý do đó, không có ngữ cảnh nào khả dụng và bạn sẽ gặp lỗi nếu bạn sử dụng bối cảnh trong initstate. Tuy nhiên didChangeDependencies chỉ được gọi vài phút sau khi trạng thái tải các phụ thuộc và bối cảnh có sẵn tại thời điểm này để ở đây bạn có thể sử dụng ngữ cảnh.

Tuy nhiên cả hai đều được gọi trước khi xây dựng được gọi. Chỉ khác là một cái được gọi trước khi trạng thái tải các phụ thuộc của nó và cái khác được gọi một vài phút sau khi trạng thái tải các phụ thuộc của nó.


1
  1. Theo initStatetài liệu

Bạn không thể sử dụng BuildContext.inheritFromWidgetOfExactTypetừ phương pháp này. Tuy nhiên, didChangeDependenciessẽ được gọi ngay lập tức theo phương pháp này, và BuildContext.inheritFromWidgetOfExactTypecó thể được sử dụng ở đó.

Vì vậy, bạn cần phải sử dụng BuildContext.inheritFromWidgetOfExactTypetrong didChangeDependencies.

  1. Mỗi Widget đều có cái riêng context. Đó là lý do tại sao bạn có quyền truy cập vào bối cảnh bên ngoài phương thức xây dựng.

Về build(BuildContext context), buildphương thức chấp nhận contexttừ các widget cha. Nó có nghĩa là tham số BuildContext contextnày không phải là bối cảnh của widget hiện tại mà là bối cảnh của cha mẹ nó.


Cảm ơn, tôi hiểu câu trả lời thứ hai, nhưng không phải câu đầu tiên, tôi biết hành vi này nhưng lý do là gì?
mohammad

didChangeDependencies sẽ được gọi ngay sau initState, nhưng tại sao chúng ta không thể sử dụng BuildContext.inheritFromWidgetOfExactType trong initState? (Tôi nhiệt tình vì lý do không phải hành vi)
mohammad

-2

Câu trả lời là đây

Không nên gọi phương thức này từ các hàm tạo của widget hoặc từ các phương thức State.initState, vì các phương thức đó sẽ không được gọi lại nếu giá trị được kế thừa thay đổi. Để đảm bảo rằng tiện ích cập nhật chính xác khi giá trị được kế thừa thay đổi, chỉ gọi lệnh này (trực tiếp hoặc gián tiếp) từ các phương thức xây dựng, bố trí và gọi lại sơn hoặc từ State.didChangeDependencies.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.