Flutter状态共享插件interstate的使用
Flutter状态共享插件interstate的使用
特性
- 小部件可以将事件传递给树中的其他interstate小部件。
- 小部件可以从其下方的小部件中查询状态。
- 动态添加的小部件会自动连接到interstate。
- 构建动态表单时无需在数据模型中镜像结构。
- 表单中的小部件可以管理自己的状态及其子级,而无需定义结构的高级状态对象。
基本解释
这并不是一个更强大的状态管理解决方案的替代品,当构建具有复杂动态属性或复杂的验证场景的表单时,它通常很有用。
当一个新的InterstateWidget附加到树上时,它会注册到最近的祖先InterstateWidget。这是如何通过树传递事件的方式。
EventHandler定义了任何特定的InterstateWidget关心的事件类型。
在触发事件时,我们可以决定如何广播该事件。
事件总是发送到本地处理程序。
- 如果
down
标志设置为true,则事件将发送到树中所有在其下的interstate小部件。 - 如果
up
标志设置为true,则事件将向上发送直到到达根InterstateWidget。 - 如果
span
标志设置为true(且up
标志也设置为true),则事件将向上发送到树中,然后沿遇到的任何分支向下发送。
开始使用
1. 添加依赖
在你的包的pubspec.yaml
文件中添加以下内容:
dependencies:
interstate: '^1.0.0'
2. 安装依赖
你可以从命令行安装包:
$ pub get
或者,你的编辑器可能支持pub。查看编辑器的文档以了解更多信息。
3. 导入包
在Dart代码中导入:
import 'package:interstate/interstate.dart';
使用示例
1. 定义一个状态对象
class NestedTextFieldState extends Equatable {
final String text;
final String error;
const NestedTextFieldState({required this.text, this.error = ""});
NestedTextFieldState copyWith({String? text, String? error}) =>
NestedTextFieldState(text: text ?? this.text, error: error ?? this.error);
@override
List<Object?> get props => [text, error];
}
2. 定义一个interstate小部件
InterstateWidget<NestedTextFieldState>(
id: uniqueId,
widgetBuilder: (BuildContext context, NestedTextFieldState state, Widget? child, InterstateController<NestedTextFieldState> controller) {
return TextFormField(
initialValue: state.text,
decoration: InputDecoration(
errorText: state.error,
border: const OutlineInputBorder()
),
onChanged: (text) {
// 发送一个字符串作为事件到本地控制器
controller.send(text);
// 然后我们发送一个验证事件到整个小部件树
controller.send(EventValidate(), up: true, down: true);
},
onEditingComplete: () {
// 我们可以在保存时查询验证状态,包括子级的验证状态!
if ((controller.send(EventValidate(), down: true).result as ValidationResponse).canSave == true) {
// 我们有有效的数据!
debugPrintSynchronously("VALID DATA:${state.text}");
}
},
),
},
controllerInitializer: (String id, bubbleUpListener) {
return InterstateController<NestedTextFieldState>(
id: id,
initialState: const NestedTextFieldState(text: ""),
bubbleUpListener: bubbleUpListener,
handlers: [],
);
},
child: child,
);
3. 定义处理程序来响应事件
handlers: [
/// 这是一个使用提供的EventValidate和ValidationResponse类的有用示例
/// 我们可以验证我们的状态,并区分局部错误和子级错误
EventHandler<EventValidate, NestedTextFieldState>(
eventDataType: EventValidate,
resultBuilder: (Event<EventValidate> event, NestedTextFieldState currentState, List<Response<EventValidate, dynamic>> subResponses) =>
ValidationResponse.fromSubResponses(
validationError: currentState.text.isEmpty ? "Required!" : null,
stateError: null,
subResponses: subResponses),
stateBuilder: (event, state, result, subresponses) {
final validationResp = result as ValidationResponse;
if (validationResp.dataValidationError != null) {
// 如果我们有一个局部验证错误,我们就相应地更新我们的状态
return state.copyWith(error: validationResp.dataValidationError ?? "");
} else if (validationResp.childrenHaveErrors) {
// 如果我们的子级有错误,我们也报告一个错误
return state.copyWith(error: "Children have errors!");
} else {
// 否则清除错误
return state.copyWith(error: "");
}
}),
/// 这接受一个字符串事件并用它来更新状态文本。通常我们会想将其包装在一个类似于这样的StringUpdateEvent类中,但为了示例代码,我们可以将其视为类型灵活性的演示
EventHandler<String, NestedTextFieldState>(
eventDataType: String,
resultBuilder: (_, __, ___) => null,
stateBuilder: (event, currentState, ___, ____) => currentState.copyWith(text: event, error: ""),
),
],
更多关于Flutter状态共享插件interstate的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter状态共享插件interstate的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
interstate
是一个用于在 Flutter 应用中实现状态共享的插件。它允许你在不同的 Widget 之间共享和管理状态,而无需使用复杂的全局状态管理解决方案。以下是如何使用 interstate
插件的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 interstate
插件的依赖:
dependencies:
flutter:
sdk: flutter
interstate: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 创建状态模型
接下来,你需要创建一个状态模型类。这个类将包含你想要共享的状态数据。
import 'package:interstate/interstate.dart';
class CounterState extends StateModel {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
}
3. 在应用中使用 InterstateProvider
在你的应用顶层使用 InterstateProvider
来提供状态模型。
import 'package:flutter/material.dart';
import 'package:interstate/interstate.dart';
import 'counter_state.dart'; // 导入你创建的状态模型
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return InterstateProvider(
models: [CounterState()], // 提供你的状态模型
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
),
);
}
}
4. 访问和修改状态
在你的 Widget 中,你可以使用 Interstate.of<T>()
来访问和修改状态。
import 'package:flutter/material.dart';
import 'package:interstate/interstate.dart';
import 'counter_state.dart';
class MyHomePage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
final counterState = Interstate.of<CounterState>(context);
return Scaffold(
appBar: AppBar(
title: Text('Interstate Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'${counterState.count}',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
counterState.increment();
},
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}