携手创作,一起成长!这是我参与「日新方案 8 月更文应战」的第6天,点击查看活动详情
本文主要介绍下GetX中几种依赖注入的方法,能够经过初始化也能够经过懒加载
1. GetxController
- 第一种
对于GetxController
这个类一般会类似咱们 iOS中的mvvmm
模式中的viewModel
,进行处理逻辑。咱们也能够寄存数据之后经过呼应式
进行包裹数据的widget
更新
- 第二种
或者说咱们把这个数据拆分下,使用一些插件进行创立比方GetX插件
一键初始化
会分红4个文件,其中咱们的方法和逻辑
放在logic
文件,承继GetxController
class DetailLogic extends GetxController {
final DetailState state = DetailState();
@override
void onReady() {
// TODO: implement onReady
super.onReady();
}
@override
void onClose() {
// TODO: implement onClose
super.onClose();
}
add(){
state.count.value++;
}
}
state
则是寄存咱们的数据
class DetailState {
var count = 0.obs;
DetailState() {
///Initialize variables
}
}
page
展现咱们的页面
class DetailPage extends StatefulWidget {
@override
_DetailPageState createState() => _DetailPageState();
}
class _DetailPageState extends State<DetailPage> {
final logic = Get.find<DetailLogic>();
final state = Get.find<DetailLogic>().state;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("GetX"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Obx(() => Text('value -> ${state.count.value}')) ,
ElevatedButton(
onPressed: ()=> logic.add(),
child: const Text('add'),
),
],
),
),
);
}
@override
void dispose() {
Get.delete<DetailLogic>();
super.dispose();
}
}
Bindings
,经过懒加载的方法初始化Logic
,也就是GetxController
class DetailsBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => DetailsLogic());
}
}
这2种方法来说,各有利弊,比方咱们自己一些简略的页面或者逻辑
,参数不是很多,就能够自己创立由于自身逻辑就比较清楚。第二种使用插件的方法相当于把逻辑和数据拆分
了,对于参数数据比较多,能够进行拆分这样会清晰点,避免过于臃肿。
2. GetPut
Get.put
由于咱们使用Gex进行路由管理的时分,在同一个堆栈中咱们能够经过page和control
联系
比方咱们页面中初始化经过Get.put
进行初始化
咱们的controller
final controller = Get.put<GetXHomeController>(GetXHomeController());
咱们在push下个页面中也能够获取
Get.find
class NextPage extends StatelessWidget {
NextPage({Key? key}) : super(key: key);
final controller = Get.find<GetXHomeController>();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("nextPage"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Obx(() => Text('value -> ${controller.count}')) ,
ElevatedButton(
onPressed: ()=> controller.add(),
child: const Text('add'),
),
],
),
),
);
}
}
咱们controller
中的count
获取到,同时点击也对上个页面刷新,相当于2个页面共用
一个controller
3. 懒加载
一般的话咱们会在初始化的时分添加绑定联系
GetPage(name: AppRoutes.getXHome, page: () => GetxHomePage(),binding: BindingsBuilder(() => Get.lazyPut(() => GetXHomeController()))),
你也能够创立一个类
class DetailBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => DetailLogic());
}
}
加载的时分
Get.to(DetailPage(),binding: DetailBinding()),
这样的话多了一个类,方便的话能够直接按上面的方法
- 获取
获取的方法也是经过
find
或者咱们承继GetView
这样少写一步获取
class NextPage extends GetView<GetXHomeController> {
const NextPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("nextPage"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Obx(() => Text('value -> ${controller.count}')) ,
ElevatedButton(
onPressed: ()=> controller.add(),
child: const Text('add'),
),
],
),
),
);
}
}
GetView
相当于帮咱们获取了
abstract class GetView<T> extends StatelessWidget {
const GetView({Key? key}) : super(key: key);
final String? tag = null;
T get controller => GetInstance().find<T>(tag: tag)!;
@override
Widget build(BuildContext context);
}
4. 小结
依赖注入
一般咱们一般能够采用懒加载
的方法binding
咱们的GetXContrller
,当然咱们也能够在页面初始化的时分经过Get.put
进行初始化。对于承继GetView
的Widget
则不需要咱们手动经过Get.find
获取。