Có cách nào để buộc rung để vẽ lại tất cả các tiện ích (ví dụ: sau khi thay đổi ngôn ngữ)?Force Flutter để vẽ lại tất cả các tiện ích
(Stackoverflow sẽ không cho phép tôi gửi trừ khi có đủ văn bản trong câu hỏi).
Có cách nào để buộc rung để vẽ lại tất cả các tiện ích (ví dụ: sau khi thay đổi ngôn ngữ)?Force Flutter để vẽ lại tất cả các tiện ích
(Stackoverflow sẽ không cho phép tôi gửi trừ khi có đủ văn bản trong câu hỏi).
Widget của bạn phải có phương thức setState(), mọi phương thức này được gọi, tiện ích được vẽ lại.
Đây là loại trường hợp sử dụng, nơi bạn có dữ liệu mà trẻ em có thể đọc nhưng bạn không muốn vượt qua một cách rõ ràng các dữ liệu vào các đối số nhà xây dựng của tất cả các trẻ em của bạn, thường đòi hỏi an InheritedWidget
. Rung sẽ tự động theo dõi các widget phụ thuộc vào dữ liệu và xây dựng lại các phần của cây đã thay đổi. Có một tiện ích LocaleQuery
được thiết kế để xử lý các thay đổi ngôn ngữ và bạn có thể xem cách nó được sử dụng trong Stocks example app.
Tóm lại, đây là những gì cổ phiếu được thực hiện:
StocksApp
) để xử lý thay đổi địa điểm. callback này làm một số công việc và sau đó trả về một trường hợp tùy chỉnh của LocaleQueryData
onLocaleChanged
luận cho MaterialApp
constructorLocaleQuery.of(context)
.Nếu bạn muốn theo dõi một thứ khác ngoài thay đổi ngôn ngữ, bạn có thể tạo lớp của riêng bạn mở rộng InheritedWidget
và đưa nó vào phân cấp gần gốc ứng dụng của bạn. Cha mẹ của nó phải là StatefulWidget
có khóa được đặt là GlobalKey
mà trẻ em có thể truy cập. Số State
của số StatefulWidget
phải sở hữu dữ liệu bạn muốn phân phối và hiển thị các phương pháp để thay đổi dữ liệu đó gọi là setState
. Nếu các tiện ích con muốn thay đổi dữ liệu của State
, chúng có thể sử dụng khóa chung để có được con trỏ tới các phương thức gọi State
(key.currentState
) và gọi trên đó. Nếu họ muốn đọc dữ liệu, họ có thể gọi phương thức tĩnh of(context)
của lớp con của bạn là InheritedWidget
và điều đó sẽ cho Flutter biết rằng các tiện ích này cần phải được xây dựng lại bất cứ khi nào State
gọi setState
của bạn.
Woo, tôi đọc ba lần và sau đó nhìn vào mã mẫu Shrine trong Flutter Gallery ba lần và vẫn chỉ có một sự hiểu biết mơ hồ. Đang thử cái này. – hackingspirit
Ví dụ đó có còn trong ví dụ Cổ phiếu không? –
Điều gì có thể hiệu quả đối với trường hợp sử dụng của bạn là sử dụng Trình điều hướng để tải lại trang. Tôi làm điều này khi chuyển đổi giữa chế độ "thực" và "demo" trong ứng dụng của tôi. Dưới đây là ví dụ:
Navigator.of(context).push(
new MaterialPageRoute(
builder: (BuildContext context){
return new SplashPage();
}
)
);
Bạn có thể thay thế "SplashPage mới() mới trong mã ở trên bằng bất kỳ tiện ích chính (hoặc màn hình) nào bạn muốn tải lại. Mã này có thể được gọi từ bất cứ nơi nào bạn có quyền truy cập vào một BuildContext (đó là hầu hết các địa điểm trong giao diện người dùng).
Bạn đang nói tôi nên thay thế trạng thái của tiện ích con cấp cao nhất (root)? Nếu tôi không có quyền truy cập vào tiện ích đó. Tôi muốn nói với Flutter để khởi động lại về cơ bản. – DogeLion
Bạn muốn tải lại toàn bộ ứng dụng? –
Tôi muốn buộc ứng dụng (bao gồm lượt xem sâu hơn trong ngăn xem) được vẽ lại (như tiêu đề cho biết).Và từ nơi tôi sẽ kích hoạt điều này, tôi không có quyền truy cập vào (các) widget gốc. – DogeLion