Flutter监听构建插件katana_listenables_builder的使用

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

Masamune logo

Katana Listenables

Follow on Twitter Follow on Threads Maintained with Melos

GitHub Sponsor


[GitHub] | [YouTube] | [Packages] | [Twitter] | [Threads] | [LinkedIn] | [mathru.net]


介绍 #

在创建小部件时,您可能需要管理多个继承自 ChangeNotifiers 的 TextEditingControllers、ValueNotifiers 和其他控制器。

这通常会看起来像以下内容。

  • 在 State 中定义多个继承自 ChangeNotifier 的类
  • 为状态管理包创建一个继承自 ChangeNotifier 的类,并为所有类添加 addListener

为了简化上述实现,我创建了以下包。

  • 创建一个简单的描述继承自 ChangeNotifier 的类
  • 通过传递一个继承自 ChangeNotifier 的对象来监控其参数。
    • 当受监控的 ChangeNotifier 发生更改时,更改将传播到自己的对象。

例如,可以使用以下语句:

[@listenables](/user/listenables)
class ControllerGroup with _$ControllerGroup, ChangeNotifier {
  factory ControllerGroup({
    required TextEditingController emailTextEditingController,
    required TextEditingController passwordTextEditingController,
    required FocusNode focusNode,
    ValueNotifier<bool> checkTerms,
  }) = _ControllerGroup;
}

运行 build_runner 后,将自动为作为参数传递的继承自 ChangeNotifier(Listenable)的类生成一个类。

如果您将其加载到 riverpod 中,例如,如下所示:

final controllerProvider = ChangeNotifierProvider((_) {
  return ControllerGroup(
    emailTextEditingController: TextEdigingController(),
    passwordTextEditingController: TextEdigingController(),
    focusNode: FocusNode(),
    checkTerms: ValueNotifier(false),
  );
});

class TestPage extends ConsumerWidget {
  [@override](/user/override)
  Widget build(BuildContext context, WidgetRef ref){
    final controller = ref.watch(controllerProvider);

    ~~~~
    controller.emailTextEditingController.text = "New Text"; // 此时,控制器也会收到更改通知,并且小部件将再次更新。
    ~~~~
  }
}

controller 中定义的 emailTextEditingController 的内容更新时,更改通知将传播到 controller

由于控制器也是一个 ChangeNotifier,可以通过 addListener 等方法监控更改。

安装 #

要使用 build_runner 进行代码生成,请导入以下包。

flutter pub add katana_listenables
flutter pub add --dev build_runner
flutter pub add --dev katana_listenables_builder

实现 #

创建类 #

创建一个如下所示的类

添加 part '(filename).listenable.dart';

[@listenables](/user/listenables) 注解定义的类,并混入 _$(定义的类名)ChangeNotifier

构造函数在 factory 中创建,并定义在参数中使用的继承自 ChangeNotifier 和 Listenable 的类。

(必需值标记为 "required";如果没有标记为 "required",则保持不变。)

构造函数之后,写上 = _ (定义的类名)

// controller.dart

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

part 'controller.listenable.dart';

[@listenables](/user/listenables)
class ControllerGroup with _$ControllerGroup, ChangeNotifier {
  factory ControllerGroup({
    required TextEditingController emailTextEditingController,
    required TextEditingController passwordTextEditingController,
    required FocusNode focusNode,
    ValueNotifier<bool> checkTerms,
  }) = _ControllerGroup;
}

代码生成 #

通过输入以下命令执行自动代码生成。

flutter pub run build_runner build --delete-conflicting-outputs

如何使用 #

由于生成的类继承自 ChangeNotifier,因此可以像一般的 ChangeNotifier 一样使用。

  • 对于 State
class TestPage extends StatefulWidget {
  [@override](/user/override)
  State<StatefulWidget> createState() => TestPageState();
}

class TestPageState extends State<TestPage> {
  final controller = ControllerGroup(
    emailTextEditingController: TextEdigingController(),
    passwordTextEditingController: TextEdigingController(),
    focusNode: FocusNode(),
    checkTerms: ValueNotifier(false),
  );

  [@override](/user/override)
  void initState(){
    super.initState();
    controller.addListener(_handledOnUpdate);
  }
	
  void _handledOnUpdate(){
    setState((){});
  }

  [@override](/user/override)
  void dispose(){
    super.dispose();
    controller.removeListener(_handledOnUpdate);
    controller.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context, WidgetRef ref){
    final controller = ref.watch(controllerProvider);

    ~~~~
    controller.emailTextEditingController.text = "New Text"; // 此时,控制器也会收到更改通知,并且小部件将再次更新。
    ~~~~
  }
}
  • 对于 riverpod
final controllerProvider = ChangeNotifierProvider((_) {
  return ControllerGroup(
    emailTextEditingController: TextEdigingController(),
    passwordTextEditingController: TextEdigingController(),
    focusNode: FocusNode(),
    checkTerms: ValueNotifier(false),
  );
});

class TestPage extends ConsumerWidget {
  [@override](/user/override)
  Widget build(BuildContext context, WidgetRef ref){
    final controller = ref.watch(controllerProvider);

    ~~~~
    controller.emailTextEditingController.text = "New Text"; // 此时,控制器也会收到更改通知,并且小部件将再次更新。
    ~~~~
  }
}

附加用法 #

添加方法 #

要添加方法,请使用以下写法。

(定义的类名)._(); 构造函数必须添加。

// controller.dart

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

part 'controller.listenable.dart';

[@listenables](/user/listenables)
class ControllerGroup with _$ControllerGroup, ChangeNotifier {
  factory ControllerGroup({
    required TextEditingController emailTextEditingController,
    required TextEditingController passwordTextEditingController,
    required FocusNode focusNode,
    ValueNotifier<bool> checkTerms,
  }) = _ControllerGroup;
  ControllerGroup._(); // 必须添加此额外构造函数

  bool checked {
    return checkTerms?.value ?? false;
  }
}

GitHub 赞助者 #

赞助者总是欢迎的。感谢您的支持!


更多关于Flutter监听构建插件katana_listenables_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter监听构建插件katana_listenables_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用katana_listenables_builder插件来监听构建状态变化的代码示例。katana_listenables_builder通常用于响应来自katana状态管理库中的状态变化,并重新构建UI。

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

dependencies:
  flutter:
    sdk: flutter
  katana: ^最新版本号
  katana_listenables_builder: ^最新版本号

然后,运行flutter pub get来获取这些依赖。

以下是一个简单的例子,展示如何使用katana_listenables_builder来监听状态变化:

import 'package:flutter/material.dart';
import 'package:katana/katana.dart';
import 'package:katana_listenables_builder/katana_listenables_builder.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return KatanaProvider(
      container: Container(
        listenables: {
          'counter': CounterListenable(),
        },
        child: MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Katana Listenables Builder Example'),
            ),
            body: KatanaListenablesBuilder<int>(
              listenableKey: 'counter',
              builder: (context, value, child) {
                return Center(
                  child: Text(
                    'Counter: $value',
                    style: TextStyle(fontSize: 24),
                  ),
                );
              },
            ),
            floatingActionButton: FloatingActionButton(
              onPressed: () {
                KatanaContainer.of<CounterListenable>(context).increment();
              },
              tooltip: 'Increment',
              child: Icon(Icons.add),
            ),
          ),
        ),
      ),
      child: Container(), // This container is just a placeholder
    );
  }
}

class CounterListenable extends Listenable {
  int _counter = 0;
  int get counter => _counter;

  void increment() {
    _counter++;
    notifyListeners();
  }
}

在这个例子中:

  1. 我们创建了一个CounterListenable类,它继承自Listenable。这个类有一个私有的_counter变量和一个公开的counter getter,以及一个increment方法来增加计数并通知监听者。

  2. MyApp类中,我们使用KatanaProvider来包裹我们的应用,并在container属性中注册了我们的CounterListenable实例,键为'counter'

  3. MaterialApphome属性中,我们使用了KatanaListenablesBuilder来监听键为'counter'Listenable对象。当计数变化时,builder函数会被调用,并更新UI。

  4. 在UI中,我们有一个FloatingActionButton,当点击它时,会调用CounterListenableincrement方法来增加计数。

这个示例展示了如何使用katana_listenables_builder来监听状态变化并相应地更新UI。注意,你需要根据实际的katanakatana_listenables_builder版本调整代码,因为API可能会有所变化。

回到顶部