Flutter类型化多值监听构建器插件multi_value_listenable_builder_typed的使用
Flutter类型化多值监听构建器插件multi_value_listenable_builder_typed的使用
MultiValueListenableBuilder
是一个用于在 Flutter 中同时监听多个 ValueListenable
的小部件。
多值监听构建器插件fork的原因
这是一个对原始的 multi_value_listenable_builder
包的重新包装。这个版本的目标是提供类型安全,而不是使用需要在构建器定义时进行类型转换的动态可监听对象。
可用的类型安全变体
DualValueListenableBuilder
TripleValueListenableBuilder
使用方法
- 将
multi_value_listenable_builder
作为依赖项添加到你的项目中。 - 在需要使用的文件中导入
package:multi_value_listenable_builder_typed/multi_value_listenable_builder_typed.dart
。 - 使用类型化的变体来实现类型化的回调。
- 使用
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
更多关于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>;
}
在这个示例中:
- 我们创建了两个
ValueNotifier
对象,一个用于整数类型,一个用于字符串类型。 - 使用
ValueListenableBuilder
包装这些ValueNotifier
对象,以便它们可以被MultiValueListenableBuilderTyped
监听。 MultiValueListenableBuilderTyped
接受一个listenables
列表,其中包含要监听的所有ValueListenable
对象。builder
回调函数接收一个包含所有监听值的列表(在本例中为整数列表和字符串列表),并基于这些值构建UI。- 浮动操作按钮(FAB)用于触发监听器的更新,通过增加整数值并更新字符串值。
请注意,此示例假设每个ValueListenable
只返回一个值,因此我们从列表中取出第一个元素。如果你的场景中有多个值,你可能需要调整逻辑以处理所有值。