Flutter中GetX系列七--依赖注入(put,lazyPut,putAsync)、Binding(统一初始化)

1.依赖注入

在前面的文章中,我们经常使用Get.put(MyController())来进行控制器实例的创建,这样我们就算不使用控制器实例也会被创建,其实GetX还提供很多创建实例的方法,可根据不同的业务来进行创建,接下来我们简单介绍一下几个最常用的

  • Get.put():不使用控制器实例也会被创建
  • Get.lazyPut():懒加载方式创建实例,只有在使用时才创建
  • Get.putAsync(): `Get.put()`的异步版版本
  • Get.create(): 每次使用都会创建一个新的实例

我们来看一下代码演示

第一步:应用程序入口配置

import 'package:flutter/material.dart';
import 'package:flutter_getx_example/DependecyInjectionExample/DependecyInjectionExample.dart';
import 'package:get/get.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: "GetX",
      home: DependecyInjectionExample(),
    );
  }
}

第二步:创建控制器

import 'package:flutter_getx_example/ObxCustomClassExample/Teacher.dart';
import 'package:get/get.dart';

class MyController extends GetxController {
  var teacher = Teacher();
  
  void convertToUpperCase() {
     teacher.name.value = teacher.name.value.toUpperCase();
  }
}

第三步:实例化控制器并使用

import 'package:flutter/material.dart';
import 'package:flutter_getx_example/GetXControllerExample/MyController.dart';
import 'package:get/get.dart';

class DependecyInjectionExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    // 即使不使用控制器实例也会被创建
    // tag将用于查找具有标签名称的实例,可以用于创建多个实例的时候进行区分
    // 控制器在不使用时被处理,permanent如果永久为真,则实例将在整个应用程序中保持活动状态,不会被释放
    MyController myController = Get.put(MyController(), permanent: true);
    // MyController myController = Get.put(MyController(), tag: "instancel", permanent: true);


    // 实例将在使用时创建(懒加载)
    // 它类似于'permanent',区别在于实例在不被使用时被丢弃
    // 但是当它再次需要使用时,get 将重新创建实例
    // Get.lazyPut(()=> MyController());
    // Get.lazyPut(()=> MyController(), tag: "instancel");



    // Get.put 异步版本
    // Get.putAsync<MyController>(() async  => await MyController());



    // 每次都将返回一个新的实例
    // Get.create<MyController>(() => MyController());

    return Scaffold(
      appBar: AppBar(
        title: Text("GetXController"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                // 实例使用的tag创建
                // Get.find<MyController>(tag: 'instancel');

                Get.find<MyController>();
              },
              child: Text("别点我"))
          ],
        ),
      ),
    );
  }
}

2.GetX Binding

在我们使用GetX状态管理器的时候,往往每次都是用需要手动实例化一个控制器,这样的话基本页面都需要实例化一次,这样就太麻烦了,而Binding 能解决上述问题,可以在项目初始化时把所有需要进行状态管理的控制器进行统一初始化,接下来看代码演示:

第一步:声明需要进行的绑定控制器类

import 'package:flutter_getx_example/GetXBindingExample/controller/BindingHomeController.dart';
import 'package:flutter_getx_example/GetXBindingExample/controller/BindingMyController.dart';
import 'package:get/get.dart';

//在同一个控制器中将所有的控制器全部进行初始化.因为使用的是lazyPut懒加载,所以再没有使用到的时候并不会进行初始化的.
class AllControllerBinding implements Bindings {
  
  @override
  void dependencies() {
    // TODO: implement dependencies
    Get.lazyPut<BindingMyController>(() => BindingMyController());
    Get.lazyPut<BindingHomeController>(() => BindingHomeController());
  }
}



import 'package:get/get.dart';

//第一个控制器
class BindingHomeController extends GetxController {
  var count = 0.obs;
  void increment() {
    count++;
  }
}


import 'package:get/get.dart';

//第二个控制器
class BindingMyController extends GetxController {
  var count = 0.obs;
  void increment() {
    count++;
  }
}

第二步:在项目启动时进行初始化绑定

绑定的方式有多种,在不同的情况下有不同的使用方式,这里介绍一种.

import 'package:flutter/material.dart';
import 'package:flutter_getx_example/GetXBindingExample/binding/AllControllerBinding.dart';
import 'package:flutter_getx_example/GetXBindingExample/GetXBindingExample.dart';
import 'package:get/get.dart';

void main() {
  runApp(MyApp());
}


class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    /// GetX Binding
    return GetMaterialApp(
      title: "GetX",
      initialBinding: AllControllerBinding(),//必须进行引入(全局绑定的getx Controller)
      home: GetXBindingExample(),
    );
  }
}

第三步:在页面中使用状态管理器

import 'package:flutter/material.dart';
import 'package:flutter_getx_example/GetXBindingExample/BHome.dart';
import 'package:flutter_getx_example/GetXBindingExample/binding/BHomeControllerBinding.dart';
import 'package:flutter_getx_example/GetXBindingExample/controller/BindingMyController.dart';
import 'package:get/get.dart';

class GetXBindingExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("GetXBinding"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Obx(() => Text(
              "计数器的值为 ${Get.find<BindingMyController>().count}",
              style: TextStyle(color: Colors.red, fontSize: 30),
            )),
            SizedBox(height: 20,),
            ElevatedButton(
              onPressed: () {
               //直接通过Get.find()就可以获取到了,不需要先调用Get.put()方法了.
                Get.find<BindingMyController>().increment();
              },
              child: Text("点击加1")
            ),
            SizedBox(height: 20,),
            ElevatedButton(
              onPressed: () {
                Get.to(BHome());

                // Get.toNamed("/bHome");

                // Get.to(BHome(), binding: BHomeControllerBinding());
              },
              child: Text("跳转去首页")
            ),
          ],
        ),
      ),
    );
  }
}

注意事项:
        不如不使用全局的GetX Binding,而是使用了
<<Flutter中GetX系列六--GetxController使用详情>>文章中的单个GetxController,存在的隐患就是如果用户首先点击了get.find()页面,而没有先单击get.put()页面的话,这个时候页面还没有进行初始化,所以就会报错.但是全局就不会存在该问题.

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 你可以使用 Flutter 的命令行工具清除 pub-cache。 在命令行/终端输入以下命令: ``` flutter pub cache repair ``` 这将清除 pub-cache 的所有内容,并重新下载所需的文件。 如果你想要更详细的控制,你可以手动删除 pub-cache 文件夹,它通常位于以下位置: - Windows:`%APPDATA%\Pub\Cache\bin` - Mac/Linux:`~/.pub-cache/bin` 然后在需要时,你可以在 Flutter 项目运行 `flutter pub get` 来重新下载需要的依赖项。 ### 回答2: 在Flutter,pub-cache是存储Flutter项目所需依赖包的地方。如果需要清除pub-cache的内容,可以按照以下步骤进行操作: 1. 打开命令行终端(Command Prompt)或终端(Terminal)。 2. 进入到Flutter SDK的安装目录,通常是在用户目录下的flutter文件夹。 3. 使用以下命令进入pub缓存目录:cd .pub-cache 4. 确保当前路径是在.pub-cache目录下。 5. 执行以下命令来清除pub-cache的内容:flutter pub cache clean 6. 稍等片刻,Flutter会清除pub-cache的内容。完成后,命令行会显示成功清除的提示信息。 需要注意的是,清除pub-cache的内容意味着清除所有已下载的依赖包。这样一来,在下次运行Flutter项目时,Flutter将会重新下载并构建所需的依赖包。因此,在清除pub-cache之前,请确保你了解清楚操作的后果,并确认需要清除pub-cache的内容。 此外,除了清除pub-cache的内容,还可以使用flutter pub cache list命令来查看当前pub-cache已安装的依赖包列表。这样可以帮助你进一步了解并管理当前项目所需的依赖包。 ### 回答3: 在Flutter,pub-cache是用于存储Flutter项目依赖的第三方库的位置。当我们使用pub命令安装依赖时,它们会被下载并存储在pub-cache目录。如果需要清除pub-cache的内容,可以按照以下步骤进行操作: 1. 首先,打开命令行界面并导航到当前Flutter项目的根目录。 2. 运行pub cache clean命令。这将清除pub-cache目录的所有内容,包括已下载的依赖。 3. 等待命令执行完成,此时pub-cache目录将被完全清除。 需要注意的是,清除pub-cache的内容会导致所有依赖被删除,因此在执行此操作之前,应确保不会影响到当前项目的运行和构建。 另外,如果只想清除特定依赖的缓存,可以使用pub cache remove命令。例如,运行pub cache remove package_name将删除名称为package_name的依赖缓存。这对于解决特定依赖问题时可能很有用。 总结:要清除pub-cache的所有内容,只需运行pub cache clean命令即可。此操作将删除项目所有依赖的缓存。如需清除特定依赖的缓存,可以使用pub cache remove命令,并指定要删除的依赖名称。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值