携手创作,一起成长!这是我参与「日新方案 8 月更文应战」的第6天,点击查看活动详情

本文主要介绍下GetX中几种依赖注入的方法,能够经过初始化也能够经过懒加载

1. GetxController

  • 第一种

对于GetxController这个类一般会类似咱们 iOS中的mvvmm模式中的viewModel,进行处理逻辑。咱们也能够寄存数据之后经过呼应式进行包裹数据的widget更新

Flutter学习-GetX-04 依赖注入

  • 第二种

或者说咱们把这个数据拆分下,使用一些插件进行创立比方GetX插件一键初始化

Flutter学习-GetX-04 依赖注入

会分红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'),
            ),
          ],
        ),
      ),
    );
  }
}

Flutter学习-GetX-04 依赖注入

咱们controller中的count获取到,同时点击也对上个页面刷新,相当于2个页面共用一个controller

Flutter学习-GetX-04 依赖注入

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进行初始化。对于承继GetViewWidget则不需要咱们手动经过Get.find获取。