Flutter控制器管理插件get_controller_plus的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

Flutter控制器管理插件get_controller_plus的使用

标题

get_controller_plus Pub #

功能介绍

  • 支持运行过程中的通知,包括持续时间。
  • 提供方便的错误处理宏函数。
  • 进一步鼓励视图和逻辑分离。
  • 提供支持的控件。

开始使用

先决条件
  • GetX
  • 熟悉 GetxController 类的使用
  • 知道如何连接 Get Observables

使用方法

实现方式与 GetxController 相同。

import 'package:get_controller_plus/get_controller_plus.dart';

class MySmartController extends GetxControllerPlus {
}

能力

加载感知

引入了 LoadAware 能力,GetxControllerPlus 提供了扩展方法:

  • isLoading getter 和 setter,以及带有 tag 变体的 isLoadingByTagsetIsLoadingByTag
// 在 GetxControllerPlus 范围内
isLoading = true;
isLoading = false;
setIsLoadingByTag(true, "anotherProcess",);

// 在视图中
Obx(
  () => {
    final isLoading = controller.isLoading;
    // 或
    // final isLoading = controller.isLoadingByTag("anotherProcess",);
    return IgnorePointer(
      ignoring: isLoading,
      child: ElevatedButton(
        onPressed: () {},
        child: isLoading ? CircularProgressIndicator.adaptive() : Text("Go",),
      ),
    );
  },
)
  • wait 方法
// 在 GetxControllerPlus 范围内运行 Future 并自动管理 isLoading 状态
final result = await wait(
  download(),
);
  • 支持 LoadAwareGetViewLoadAwareWillPopScope 控件
import 'package:get_controller_plus/support_widgets.dart';

LoadAwareGetView<MySmartController>(
  builder: (BuildContext context, bool isLoading, Widget? child) {
    if (isLoading) {
      return CircularProgressIndicator.adaptive();
    } else {
      return MySmartView();
    }
  },
)

// 如果 isLoading 为真,则不会弹出此 widget
LoadAwareWillPopScope<MySmartController>(
  // 可以覆盖默认的 onWillPop 行为
  // onWillPop: ...
  child: Scaffold(),
)
错误处理

GetxControllerPlus 提供了两个额外的方法来处理错误。

  • setErrorHandler<T>
// 公共方法,可以在 View 范围或控制器范围本身调用
// 首先设置它以便在 handleError 方法中可用

// 在视图中
controller.setErrorHandler<IOException>(
  showAlertDialog(
    context: context,
    builder: (BuildContext context) {
      return AlertDialog(
        title: Text("Error",),
        content: Text("Connection Error!",),
      );
    },
  ),
);

// 在控制器中
// 最好在 onInit 状态中设置
void _showFormatError() {
  _hasError.value = true;
}

@override
void onInit() {
  super.onInit();
  setErrorHandler<FormatException>(
    _showFormatError,
  );
}
  • handleError(Object err)
// 受保护的方法,在控制器范围内调用
Future<void> doSomething() async {
  try {
    // myMagic();
  } catch (err) {
    handleError(err,);
  }
}

更多关于Flutter控制器管理插件get_controller_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter控制器管理插件get_controller_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用get_controller_plus插件来管理控制器的示例代码。get_controller_plus是一个用于简化Flutter中控制器(如TextEditingController)管理的插件,它通常与get包一起使用,以便更方便地在整个应用程序中访问和更新状态。

首先,确保你已经在pubspec.yaml文件中添加了getget_controller_plus依赖:

dependencies:
  flutter:
    sdk: flutter
  get: ^4.6.1  # 请检查最新版本
  get_controller_plus: ^1.0.0  # 请检查最新版本

然后,运行flutter pub get来安装这些依赖。

接下来,我们创建一个简单的示例,展示如何使用get_controller_plus来管理一个TextEditingController

1. 创建控制器类

首先,创建一个继承自GetxController的控制器类,并在其中定义你的控制器属性。例如,我们可以创建一个MyController类来管理一个文本编辑控制器。

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

class MyController extends GetxController with GetSingleTickerProviderStateMixin {
  final TextEditingController textController = TextEditingController();

  @override
  void onInit() {
    super.onInit();
    // 可以在这里初始化控制器,比如设置初始文本
    textController.text = 'Hello, Get_controller_plus!';
  }

  @override
  void onClose() {
    // 清理资源,比如释放控制器
    textController.dispose();
    super.onClose();
  }
}

2. 在应用中绑定控制器

在你的应用入口(通常是main.dart)中,使用Get.put来绑定控制器。

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

void main() {
  runApp(GetMaterialApp(
    home: MyHomePage(),
    getPages: [
      GetPage(name: '/', page: () => MyHomePage()),
      // 其他页面路由
    ],
    initialBinding: MyBindings(),
  ));
}

class MyBindings implements Bindings {
  @override
  void dependencies() {
    Get.put(MyController());
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final MyController controller = Get.find<MyController>();
    return Scaffold(
      appBar: AppBar(title: Text('Get_controller_plus Example')),
      body: Center(
        child: TextField(
          controller: controller.textController,
          decoration: InputDecoration(hintText: 'Type something...'),
        ),
      ),
    );
  }
}

3. 使用控制器

在你的页面或组件中,使用Get.find来获取并使用控制器。如上例所示,我们在MyHomePage中已经展示了如何获取并使用textController

4. 响应式更新(可选)

如果你想在控制器属性值变化时自动更新UI,可以结合GetXObx来使用。例如,如果你想监听文本变化并做一些处理,可以在控制器中添加一个RxString属性,并在UI中使用Obx来监听变化。

class MyController extends GetxController with GetSingleTickerProviderStateMixin {
  final TextEditingController textController = TextEditingController();
  RxString text = ''.obs; // 响应式字符串

  @override
  void onInit() {
    super.onInit();
    textController.addListener(() {
      text.value = textController.text; // 当文本变化时更新响应式字符串
    });
    textController.text = 'Hello, Get_controller_plus!';
  }

  @override
  void onClose() {
    textController.dispose();
    super.onClose();
  }
}

// 在UI中使用Obx来监听text的变化
class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final MyController controller = Get.find<MyController>();
    return Scaffold(
      appBar: AppBar(title: Text('Get_controller_plus Example')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextField(
              controller: controller.textController,
              decoration: InputDecoration(hintText: 'Type something...'),
            ),
            SizedBox(height: 20),
            Obx(() => Text('You typed: ${controller.text}')), // 响应式显示文本
          ],
        ),
      ),
    );
  }
}

以上就是一个简单的使用get_controller_plus来管理Flutter控制器的示例。通过结合get包,你可以更方便地在整个应用中管理和访问状态。

回到顶部