Flutter Getx 使用Get.to跳轉頁面時,控制器無法正常銷毀的問題,控制器的init無法接收參數問題

先看我的代碼 看著很正常

class ControlPage extends StatelessWidget {
  ControlPage({Key? key}) : super(key: key);
  final ControlData data = Get.put(ControlData());

  @override
  Widget build(BuildContext context) {
    return JPage(
      title: "控制器聲明外部,退出頁面是否會銷毀",
      children: [],
    );
  }
}

然后跳轉

Get.to(ControlPage(),arguments: {'id':999});

然后退出頁面,之后看控制臺打印


image.png

可以看出并沒有控制器銷毀的日志,然后我開始不知道怎么回事,于是乎我把控制器放到build里面聲明,這樣退出頁面,控制器確實跟著銷毀了,
但是,我百度看getx的文章,控制器并沒有必須這樣聲明,所以肯定是哪里有問題

class ControlPage extends StatelessWidget {
  ControlPage({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
 final ControlData data = Get.put(ControlData());
    return JPage(
      title: "控制器聲明外部,退出頁面是否會銷毀",
      children: [],
    );
  }
}

于是乎,又看了一下日志,發(fā)現有個警告


image.png

這是 GetX 的一個優(yōu)化建議警告,意思是你在使用 Get.to() 時,傳入的是Widget 實例,而它建議你傳入一個函數(Widget 構造器)。
理由是:
Get.to(MyPage()):這會立即實例化 MyPage,不利于內存管理,尤其是和 Controller 生命周期相關時。
Get.to(() => MyPage()):這是一個延遲構建的方式,只有在真正 push 頁面的時候才創(chuàng)建頁面實例,GetX 也能更好地在頁面被銷毀時自動釋放相關 Controller。
如果你頁面中用了 Get.put() 或 Get.lazyPut() 注冊 Controller,或者用 GetBuilder / Obx 綁定狀態(tài)管理,這種時候必須使用 () => Page(),否則 Controller 可能不會被銷毀。

// ? 不推薦
Get.to(MyPage());

// ? 推薦
Get.to(() => MyPage());

使用 第二種方式之后,你會發(fā)現在控制的init可以正常獲取參數了Get.arguments,如果是第一種,只能在onReady才可以獲取到傳入的參數

其實我覺得getx應該禁止第一種方式,而不是警告,強制使用第二種,避免不必要的問題
好了,到此問題解決!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容