2024年3月11日 星期一

【Flutter】Looking up a deactivated widget's ancestor is unsafe

 簡單來說,就是要使用Router切換Widget時無法切換。

真正的原因是Router當真正要執行時呼叫程式設計給它的BuildContext參數,卻發現這個參數無法使用。


更具體來說,在很多地方(函數)會收到BuildContext傳入。

設計上會習慣在這些地方(函數)區段內將這些BuildContext傳給需要使用的功能,但偶爾會發生這些BuildContext不能使用的情況。

例如在AlertDialog裡取得的BuildContext就無法用在Router上。(因為Router會用這個BuildContext做定位、來知道Widget與Widget之間的關係,與它們在WidgetTree上的位置。而一個已經關閉的Dialog並不在WidgetTree上。)


解決這個錯誤的方法基本上是使用「GlobalKey」

簡單來說就是在Widget的建構子/Build階段傳入一個GlobalKey物件的實體到「key」這個欄位中。確認傳入後,就可以在這個Widget下使用GlobalKey的「currentContext」這個參數去取得可用的BuildContext(A),然後在宣告Router並需要傳入BuildContext的地方改傳入BuildContext(A)。