Flutter值监听扩展插件value_listenable_extensions的使用
Flutter值监听扩展插件value_listenable_extensions的使用
本包包含一组有用的ValueListenable
扩展方法以及新的抽象,用于构建具有ValueListenable
接口的类。
扩展方法
connect
类似于addListener
,但通过返回取消订阅的回调来处理内联函数,从而减轻调用者使用命名函数(之后将用于removeListener
)的负担。
从语义上讲,它与addListener
(和listen
)不同之处在于它会立即使用ValueListenable
的当前value
调用回调。
final source = ValueListenable(1);
final cancel = source.connect((v) => print(v));
// 打印 1
source.value = 2;
// 打印 2
cancel();
map
创建一个新的ValueListenable
,其值由给定函数映射自源ValueListenable
。
调用map
的方需要拥有新创建的ValueListenable
的所有权,并应在以后dispose
它。
final source = ValueNotifier('hello');
final mapped = source.map((v) => v.length);
// mapped.value == 5
source.value = '';
// mapped.value == 0
mapped.dispose();
listen
类似于addListener
的一个变种,它返回一个取消订阅的回调,因此对内联函数非常有用。
像addListener
一样,它会在每次后续更改时被调用(但不包括初始值)。
final source = ValueListenable(1);
final cancel = source.listen((v) => print(v));
// 打印无内容
source.value = 2;
// 打印 2
cancel();
combineLatest*
combineLatest*
函数提供了类似map
的功能,可以与多个ValueListenable
输入一起使用(2到20个)。
返回的输出ValueListenable
将在任何输入更改时更新(并且计算出的新值与之前的值不同,就像通常的ValueNotifier
比较一样)。
final a = ValueNotifier(0);
final b = ValueNotifier(0);
final maxValue = combineLatest(a, b, (a, b) => max(a, b));
// maxValue.value == 0
a.value = 5;
// maxValue.value == 5
b.value = 3;
// maxValue.value 仍然是 5,内部重新计算了但未通知外部更改
b.value = 9;
// maxValue.value == 9
maxValue.dispose();
CombinedValueListenable
combineLatest*
的类版本很有用,可用于构建由小而独立的部分组成的或依赖于外部输入的状态对象,除了它们的内部状态之外。
从头开始重建输出状态有许多好处:与在先前状态下使用copyWith
不同,不会忘记更新依赖字段,并且可以将映射/组合逻辑隔离测试(如果它是自由函数或静态方法(建议这样做以避免无意中依赖其他实例状态))。
class _GreetingState extends CombinedValueListenable<String> {
_GreetingState() {
// 在构造函数主体中必须调用一次 `connect*` 方法
connect2(_firstName, _lastName, map);
}
final _firstName = ValueNotifier('');
final _lastName = ValueNotifier('');
set firstName(String value) => _firstName.value = value;
set lastName(String value) => _lastName.value = value;
static String map(String firstName, String lastName) {
return [
'Hello',
if (firstName != '') firstName,
if (lastName != '') lastName,
].join(' ');
}
}
更多关于Flutter值监听扩展插件value_listenable_extensions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter值监听扩展插件value_listenable_extensions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用value_listenable_extensions
插件的一个代码示例。这个插件提供了一种简洁的方式来监听和响应ValueListenable
对象的变化,通常用于与Flutter的Provider
模式或其他状态管理方案结合使用。
首先,确保你已经在pubspec.yaml
文件中添加了value_listenable_extensions
依赖:
dependencies:
flutter:
sdk: flutter
value_listenable_extensions: ^1.0.0 # 请检查最新版本号
然后,运行flutter pub get
来获取依赖。
接下来,是一个简单的例子,展示如何使用ValueListenableBuilder
来监听一个ValueListenable
对象的变化。
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:value_listenable_extensions/value_listenable_extensions.dart';
// 定义一个简单的ValueListenable对象
class Counter with ValueNotifier<int> {
Counter(int value) : super(value);
void increment() {
value++;
}
}
void main() {
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => Counter(0)),
],
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'ValueListenable Extensions Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final counter = Provider.of<Counter>(context);
return Scaffold(
appBar: AppBar(
title: Text('ValueListenable Extensions Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ValueListenableBuilder<int>(
valueListenable: counter,
builder: (_, value, __) {
return Text(
'You have pushed the button this many times:',
style: Theme.of(context).textTheme.headline4,
);
},
child: Text(
'${counter.value}',
style: Theme.of(context).textTheme.headline4,
),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
counter.increment();
},
child: Text('Increment'),
),
],
),
),
);
}
}
解释
- Counter 类:这是一个继承自
ValueNotifier<int>
的类,用于存储和更新计数器值。 - MultiProvider:使用
MultiProvider
和ChangeNotifierProvider
来提供Counter
实例。 - ValueListenableBuilder:使用
ValueListenableBuilder
来监听Counter
对象的值变化。当Counter
的值变化时,ValueListenableBuilder
会重新构建其子组件(在这个例子中是显示计数器值的Text
组件)。 - ElevatedButton:一个简单的按钮,用于增加计数器的值。
在这个例子中,ValueListenableBuilder
监听Counter
对象的值变化,并在值变化时更新显示的文本。这种方式简化了ValueListenable
对象的状态管理,使代码更加简洁和易于维护。