目录

前言

一、GetView

二、GetWidget

三、GetService用法


前言

        这篇文章主要介绍下GetView、GetWidget、GetService的用法。

一、GetView

        GetView 是 GetX 中的一个便捷小部件,用于创建只需要一个 Controller 的页面。通常情况下,我们需要手动获取 Controller 实例,但使用 GetView 可以自动获取指定的 Controller,无需在代码中显式调用 Get.find。

        使用GetView,自动提供绑定的 Controller,无需手动调用 Get.find。

        以下是一个使用 GetView 和 Get.put 的完整示例,展示一个简单的计数器。

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

// 创建控制器
class CounterController extends GetxController {
  var counter = 0.obs;

  void increment() {
    counter++;
  }
}

// 使用 GetView 创建页面
class CounterPage extends GetView<CounterController> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Counter Page')),
      body: Center(
        child: Obx(() => Text('Counter: ${controller.counter}', 
          style: const TextStyle(fontSize: 24),
        )),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: controller.increment,
        child: const Icon(Icons.add),
      ),
    );
  }
}

void main() {
  runApp(
    GetMaterialApp(
      initialBinding: BindingsBuilder(() {
        Get.put(CounterController()); // 注册 CounterController
      }),
      home: CounterPage(),
    ),
  );
}

        它的使用场景如下:etView 适用于只需一个 Controller 的页面,它可以避免手动获取 Controller 实例的冗余代码。

二、GetWidget

        GetWidget 是 GetX 提供的一个便捷工具,主要用于创建具有持久化控制器实例的组件或小部件。与 GetView 相似,GetWidget 可以直接获取 Controller,但它的特殊之处在于:在多次构建过程中,GetWidget 会一直保持同一个控制器实例,而不会因为小部件重新构建而丢失状态。

        GetWidget的特点如下:

  1. 持久化:无论小部件如何重新构建,控制器实例都不会丢失。
  2. 便于封装:非常适合封装那些需要频繁构建的组件,避免重新获取控制器。
  3. 泛型支持:通过泛型指定控制器的类型,使得代码安全、简洁

        它的使用场景如下:

  1. 用于需要重复构建的组件,例如列表项、按钮等。

  2. 当组件需要依赖控制器的数据且不希望控制器实例被重新创建时(例如,在不同页面的 Tab 中共享状态)。

         我们还是以计时器的代码为例:

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

// 定义控制器
class CounterController extends GetxController {
  var counter = 0.obs;

  void increment() {
    counter++;
  }
}

// 定义 CounterWidget
class CounterWidget extends GetWidget<CounterController> {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Obx(() => Text(
                'Counter: ${controller.counter}',
                style: const TextStyle(fontSize: 24),
              )),
          ElevatedButton(
            onPressed: controller.increment,
            child: const Text('Increment'),
          ),
        ],
      ),
    );
  }
}

// 应用入口
void main() {
  runApp(
    GetMaterialApp(
      initialBinding: BindingsBuilder(() {
        // 注册控制器实例,确保在 CounterWidget 使用前控制器已经存在
        Get.put<CounterController>(CounterController());
      }),
      home: Scaffold(
        appBar: AppBar(title: const Text('GetWidget Example')),
        body: CounterWidget(), // 使用 CounterWidget
      ),
    ),
  );
}

        在上面的代码中,我们做了以下工作:

  1. 定义 CounterController:控制器中有一个可观察的计数变量 counter,并包含自增方法 increment。
  2. 创建 CounterWidget:继承 GetWidget<CounterController>,通过 controller 直接访问控制器实例。
  3.  在 Bindings 中注册控制器:使用 Get.put 注册控制器实例,以便在组件中保持持久化访问
  4.  响应式更新:通过 Obx 监听 counter 的变化,在调用 increment 后自动刷新界面。

        总结一下,GetWidget 是 GetX 中用于创建持久化控制器的组件工具,适合在多次重构的小部件中共享控制器实例。与 GetView 类似,它通过泛型自动注入控制器,但提供了更强的持久化特性,非常适合用在需要重复构建的界面元素中。

三、GetService用法

        GetService 其实并不是 GetX 中的一个直接组件或类,而是一个在实际开发中常用的概念,即通过 GetX 框架中提供的 Get.put、Get.lazyPut 等方法来注册、管理和访问服务类。这些服务类通常在应用生命周期内保持为单例,适用于诸如 API 管理、数据存储、日志管理等场景。

        GetX 服务管理的典型用法如下:

        在 GetX 中,将服务类作为全局实例注册并访问的方法和思路非常方便。以下是一个服务的创建和注册过程。

1.创建服务类

        定义一个服务类,比如 ApiService,用于处理所有网络请求:

import 'package:get/get.dart';

class ApiService extends GetxService {
  // 假设有一个异步初始化方法
  Future<ApiService> init() async {
    // 在这里初始化一些数据、配置或进行网络请求
    print("ApiService initialized");
    return this;
  }

  // 定义一些操作或功能方法
  Future<String> fetchData() async {
    // 模拟网络请求
    await Future.delayed(Duration(seconds: 1));
    return "Fetched Data";
  }
}

2.注册服务

        在应用启动时(比如 main.dart 文件中),使用 Get.putAsync 注册服务,这样可以确保服务初始化完成后才会注册。

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'api_service.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 注册 ApiService,并等待其初始化
  await Get.putAsync<ApiService>(() async => ApiService().init());

  runApp(MyApp());
}

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

3.使用服务

        一旦服务被注册,可以通过 Get.find<ApiService>() 获取该服务实例,任何地方都可以直接调用服务中的方法。

class HomeScreen extends StatelessWidget {
  final ApiService apiService = Get.find<ApiService>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("GetX Service Example")),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            String data = await apiService.fetchData();
            Get.snackbar("Data", data, snackPosition: SnackPosition.BOTTOM);
          },
          child: const Text("Fetch Data"),
        ),
      ),
    );
  }
}

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐