Flutter类型化多值监听构建器插件multi_value_listenable_builder_typed的使用

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

Flutter类型化多值监听构建器插件multi_value_listenable_builder_typed的使用

MultiValueListenableBuilder 是一个用于在 Flutter 中同时监听多个 ValueListenable 的小部件。

pub

多值监听构建器插件fork的原因

这是一个对原始的 multi_value_listenable_builder 包的重新包装。这个版本的目标是提供类型安全,而不是使用需要在构建器定义时进行类型转换的动态可监听对象。

可用的类型安全变体

  1. DualValueListenableBuilder
  2. TripleValueListenableBuilder

使用方法

  1. multi_value_listenable_builder 作为依赖项添加到你的项目中。
  2. 在需要使用的文件中导入 package:multi_value_listenable_builder_typed/multi_value_listenable_builder_typed.dart
  3. 使用类型化的变体来实现类型化的回调。
  4. 使用 MultiValueListenableBuilder 来监听更多的可监听对象,就像使用其他小部件一样。
import 'package:multi_value_listenable_builder_typed/multi_value_listenable_builder_typed.dart';

MultiValueListenableBuilder(
  // 添加所有的 ValueListenable
  valueListenables: [
    listenable0,
    listenable1,
    listenable2,
    ...
    listenableN
  ],
  builder: (context, values, child) {
    // 获取每个可监听对象的更新值
    return YourWidget(
      values.elementAt(0),
      values.elementAt(1),
      values.elementAt(2),
      ...
      values.elementAt(N),
      child: child // 可选的子组件
    );
  },
  child: YourOptionalChildWidget()
)

完整示例

以下是一个详细的示例,展示了如何使用 MultiValueListenableBuilder

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

void main() {
  runApp(
    MaterialApp(
      title: 'Multi-ValueListenableBuilder Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Demo(),
    ),
  );
}

class Demo extends StatefulWidget {
  Demo({Key? key}) : super(key: key);

  [@override](/user/override)
  _DemoState createState() => _DemoState();
}

class _DemoState extends State<Demo> {
  List<String> _labels = ['Alpha', 'Red', 'Green', 'Blue'];
  List<ValueNotifier<int>> _argb = [
    ValueNotifier(255), // Alpha
    ValueNotifier(255), // Red
    ValueNotifier(255), // Green
    ValueNotifier(255), // Blue
  ];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Multi-ValueListenableBuilder Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Padding(
              padding: const EdgeInsets.symmetric(vertical: 50.0),
              child: MultiValueListenableBuilder(
                valueListenables: _argb,
                builder: (context, values, child) {
                  return Container(
                    decoration: ShapeDecoration(
                      shadows: [BoxShadow(blurRadius: 5)],
                      shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(20.0),
                      ),
                      color: Color.fromARGB(
                        values.elementAt(0), // Alpha
                        values.elementAt(1), // Red
                        values.elementAt(2), // Green
                        values.elementAt(3), // Blue
                      ),
                    ),
                    height: 200,
                    width: 200,
                  );
                },
              ),
            ),
            Column(
              children: [0, 1, 2, 3]
                  .map(
                    (index) => Row(
                      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                      children: [
                        Text(
                          _labels.elementAt(index),
                          style: TextStyle(fontSize: 20.0),
                        ),
                        ValueListenableBuilder<int>(
                          valueListenable: _argb.elementAt(index),
                          builder: (BuildContext context, int value, Widget? child) {
                            return Slider(
                              value: value.toDouble(),
                              max: 255,
                              min: 0,
                              onChanged: (newValue) {
                                _argb[index].value = newValue.toInt();
                              },
                            );
                          },
                        )
                      ],
                    ),
                  )
                  .toList(),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何使用multi_value_listenable_builder_typed插件的示例代码。这个插件允许你在Flutter中监听多个ValueListenable对象,并根据它们的值来构建UI。以下是一个简单的示例,展示如何使用这个插件来监听两个ValueListenable对象并更新UI。

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

dependencies:
  flutter:
    sdk: flutter
  multi_value_listenable_builder_typed: ^最新版本号  # 请替换为实际最新版本号

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

接下来是示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('MultiValueListenableBuilderTyped Demo'),
        ),
        body: MultiValueListenableBuilderTyped<int, String>(
          listenables: [
            ValueListenableBuilder<int>(
              valueListenable: _createIntListenable(),
              builder: (_, int value, __) {
                return value;
              },
            ),
            ValueListenableBuilder<String>(
              valueListenable: _createStringListenable(),
              builder: (_, String value, __) {
                return value;
              },
            ),
          ],
          builder: (_, List<int> intValues, List<String> stringValues) {
            // intValues 和 stringValues 分别包含所有 int 和 String 类型的监听值
            // 在这个例子中,我们假设每个 listenable 只返回一个值,因此可以使用 intValues[0] 和 stringValues[0]
            return Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text('Integer Value: ${intValues.first}'),
                  Text('String Value: ${stringValues.first}'),
                ],
              ),
            );
          },
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            // 触发监听器更新
            _intValueController.value++;
            _stringValueController.value = 'New String Value ${_intValueController.value}';
          },
          tooltip: 'Increment',
          child: Icon(Icons.add),
        ),
      ),
    );
  }

  ValueListenable<int> _createIntListenable() {
    final _intValueController = ValueNotifier<int>(0);
    return _intValueController;
  }

  ValueListenable<String> _createStringListenable() {
    final _stringValueController = ValueNotifier<String>('Initial String Value');
    return _stringValueController;
  }

  late final ValueNotifier<int> _intValueController = _createIntListenable() as ValueNotifier<int>;
  late final ValueNotifier<String> _stringValueController = _createStringListenable() as ValueNotifier<String>;
}

在这个示例中:

  1. 我们创建了两个ValueNotifier对象,一个用于整数类型,一个用于字符串类型。
  2. 使用ValueListenableBuilder包装这些ValueNotifier对象,以便它们可以被MultiValueListenableBuilderTyped监听。
  3. MultiValueListenableBuilderTyped接受一个listenables列表,其中包含要监听的所有ValueListenable对象。
  4. builder回调函数接收一个包含所有监听值的列表(在本例中为整数列表和字符串列表),并基于这些值构建UI。
  5. 浮动操作按钮(FAB)用于触发监听器的更新,通过增加整数值并更新字符串值。

请注意,此示例假设每个ValueListenable只返回一个值,因此我们从列表中取出第一个元素。如果你的场景中有多个值,你可能需要调整逻辑以处理所有值。

回到顶部