在开发中的过程中可能会遇到这样的需求:同一个界面被循环跳转多次并且通过传递的参数不同刷新当前界面的数据。
场景如下:
接下来我们看下分析看,如何解决这个问题。
我们常用的方式是创建一个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());
})
),
...
]
问题解决了,开心。