2017-05-04 17 views

Trả lời

0

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.

Documentation : Widget setState()

+0

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

+0

Bạn muốn tải lại toàn bộ ứng dụng? –

+0

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

11

Đâ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:

  • Đặt một callback trên widget gốc (trong trường hợp này, 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
  • Đăng ký callback này như onLocaleChanged luận cho MaterialApp constructor
  • widget trẻ em cần thông tin địa phương sử dụng LocaleQuery.of(context).
  • Khi ngôn ngữ thay đổi, Rung chỉ vẽ lại các tiện ích phụ thuộc vào dữ liệu miền địa phương.

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.

+0

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

+0

Ví dụ đó có còn trong ví dụ Cổ phiếu không? –

0

Đ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).

Các vấn đề liên quan