Flutter 使用 Getx 实现同一个界面被循环跳转多次并刷新数据的解决方案

在开发中的过程中可能会遇到这样的需求:同一个界面被循环跳转多次并且通过传递的参数不同刷新当前界面的数据。

场景如下:

接下来我们看下分析看,如何解决这个问题。

我们常用的方式是创建一个View extends GetView, 再创建 Controller extends GetxController,然后在 app_pages.dart文件中配置路由,然后就可以调用Getx提供的路由方法(比如:Get.toNamed )跳转到界面了,大概像下面这样(忽略细节):

View

scala 复制代码
class HomePage extends GetView<HomePageController> {
  const ScreenPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    
    return Scaffold(
      appBar: null,
      body:SizedBox(
                  /// 省略布局
      ),
    );
  }
}

Controller

scala 复制代码
class HomePageController extends GetxController {

    @override
    void onInit()  {
        super.onInit();
        ///loading 数据
        }

}

路由配置

php 复制代码
static final routes = [
...
  GetPage(
    name: _Paths.HOME,
    page: () => const HomePage(),
    binding: BindingsBuilder((){
        Get.lazyPut<HomePageController>(()=>HomePageController());
    })

  ),
  ...
  ]

跳转

css 复制代码
Get.toNamed(Routes.HOME, arguments: {"arg1": 0, "arg2": 0});

我们注意到路由配置中使用到了,Get.lazyPut ,当你调过一次这个控制器后就会被缓存起来,直到这个控制器被销毁前它都是同一个实例,也就是俗称的单例。当在一个app中出现循环调用同一个界面时,它绑定的控制器不会重新初始化,导致界面数据不会被刷新。

怎么办呢?

这个时候我们的主角就上场了,他就是 "冷门" 而强大的 Get.create 搭配 GetWidget 使用就能解决我们遇到的问题。顾名思义,Get.create会在每次调用该控制器时重新创建一个新的实例控制器,且保留当前数据。

View 中的 GetView 替换为 GetWidget, 路由配置中的 Get.lazyPut 替换为 Get.create,这样就能实现同一个界面被循环跳转多次并且通过传递的参数不同刷新当前界面的数据的需求了。

更改后的代码:

View

scala 复制代码
class HomePage extends GetWidget<HomePageController> {
  const ScreenPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    
    return Scaffold(
      appBar: null,
      body:SizedBox(
                  /// 省略布局
      ),
    );
  }
}

路由配置

php 复制代码
static final routes = [
...
  GetPage(
    name: _Paths.HOME,
    page: () => const HomePage(),
    binding: BindingsBuilder((){
        Get.create<HomePageController>(()=>HomePageController());
    })

  ),
  ...
  ]

问题解决了,开心。

相关推荐
心中有国也有家26 分钟前
AtomGit Flutter 鸿蒙客户端:呼吸球动画
学习·flutter·华为·harmonyos
心中有国也有家3 小时前
AtomGit Flutter 鸿蒙客户端:呼吸练习的三种科学模式
学习·flutter·华为·harmonyos
yuanlaile4 小时前
前端转 Flutter 自学完整规划,避开跨栈思维转换误区
前端·flutter·flutter跨平台开发
姑苏倾城客4 小时前
Flutter中,html 与 dart 桥接沟通
javascript·flutter·html
ZZZMMM.zip5 小时前
基于鸿蒙HarmonyOS NEXT开发AI书籍推荐应用:智能阅读新体验与鸿蒙Flutter框架跨端实践
人工智能·flutter·华为·harmonyos·鸿蒙
铅笔侠_小龙虾5 小时前
DSL-Flutter : 告别嵌套地狱,用缩进书写 Flutter!
flutter
ZZZMMM.zip19 小时前
基于鸿蒙HarmonyOS NEXT开发AI股票分析应用:智能投资新体验与鸿蒙Flutter框架跨端实践
人工智能·flutter·华为·harmonyos·鸿蒙
韩曙亮1 天前
【Flutter】Flutter 进程保活 ③ ( 屏幕常亮设置 | Flutter 禁止息屏、关闭自动锁屏、屏蔽系统屏保 )
android·flutter·ios·屏幕常亮·禁止息屏
心中有国也有家1 天前
AtomGit Flutter 鸿蒙客户端:情绪日记的时间线实现
学习·flutter·华为·harmonyos
西西学代码1 天前
Flutter---Container
flutter