Flutter序列化控制器插件serializable_controllers的使用
Flutter序列化控制器插件serializable_controllers的使用
serializable_controllers
是一个简单的包,旨在处理表单中的值时减少一些样板代码。
概述
通过 SerializableControllersManager
类使用 makeController
方法创建控制器,并将它们分配给表单中所需的部件。每个控制器都实现了 ValueNotifier
,因此可以轻松监听更改。
您可以随时通过 SerializableControllersManager
的 toJson
方法获取值的序列化。
请记住在使用完毕后调用 dispose
方法来避免内存泄漏!
提供的控制器
SerializableTextEditingController
为 TextEditingController
提供抽象。内部的 TextEditingController
可通过对象的 controller
属性访问。
示例:
final serializableTextEditingController = manager.makeController(
() => SerializableTextEditingController(id: 'myId'),
);
final textEditingController = serializableTextEditingController.controller;
您可以直接监听对象来代替无聊的监听器:
ValueListenableBuilder(
valueListenable: nameController,
builder: (_, value, __) => Text(value ?? ''),
),
SerializableChangeController
提供了一种通过小部件的 ValueChanged
回调轻松更新值的方法。
示例:
final checkboxController = manager.makeController(
() => SerializableChangeController(
id: 'radio',
initialValue: false,
),
);
使用方法如下:
// 在构建方法中
ValueListenableBuilder(
valueListenable: checkboxController,
builder: (context, value, _) =>
CheckboxListTile(
value: value,
onChanged: checkboxController.valueChanged,
title: Text('Boolean check'),
)
),
如您所见,您可以轻松更新UI而无需太多麻烦。
自定义控制器
您可以通过扩展 SerializableController<T>
来创建自己的控制器!
打印值
假设您已经创建了 manager
:
final manager = SerializableControllersManager();
只需调用:
print(jsonEncode(manager.toJson()));
查看示例以了解更多信息。
完整示例
以下是一个完整的示例,展示了如何使用 serializable_controllers
插件:
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:serializable_controllers/serializable_controllers.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Home(),
);
}
}
class Home extends StatefulWidget {
[@override](/user/override)
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
final manager = SerializableControllersManager();
SerializableTextEditingController nameController;
SerializableTextEditingController surnameController;
SerializableChangeController checkboxController;
[@override](/user/override)
void initState() {
nameController = manager.makeController(
() => SerializableTextEditingController(id: 'nome', initialValue: 'Pippo'),
);
surnameController = manager.makeController(
() => SerializableTextEditingController(id: 'cognome'),
);
checkboxController = manager.makeController(
() => SerializableChangeController(
id: 'radio',
initialValue: false,
),
);
super.initState();
}
[@override](/user/override)
void dispose() {
manager.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Serializable controllers'),
),
body: Column(
children: [
TextFormField(
controller: nameController.controller,
),
ValueListenableBuilder(
valueListenable: nameController,
builder: (_, value, __) => Text(value ?? ''),
),
TextFormField(
controller: surnameController.controller,
),
ValueListenableBuilder(
valueListenable: checkboxController,
builder: (context, value, _) => CheckboxListTile(
value: value,
onChanged: checkboxController.valueChanged,
title: Text('Boolean check'),
),
),
ElevatedButton(
onPressed: () {
final encoder = JsonEncoder.withIndent(' ');
final encoded = encoder.convert(manager);
return showDialog(
context: context,
builder: (_) => AlertDialog(
content: Text(encoded),
),
);
},
child: Text('Submit'),
)
],
),
floatingActionButton: FloatingActionButton(
onPressed: manager.resetControllers,
child: Icon(Icons.restore),
),
);
}
}
更多关于Flutter序列化控制器插件serializable_controllers的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter序列化控制器插件serializable_controllers的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
serializable_controllers
是一个用于 Flutter 的插件,它允许你将控制器(如 TextEditingController
、ScrollController
等)序列化和反序列化。这在需要保存和恢复应用状态时非常有用,例如在应用暂停或重新启动时。
以下是如何使用 serializable_controllers
插件的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 serializable_controllers
插件的依赖:
dependencies:
flutter:
sdk: flutter
serializable_controllers: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 创建可序列化的控制器
serializable_controllers
提供了一些可序列化的控制器,例如 SerializableTextEditingController
。你可以像使用普通控制器一样使用它们。
import 'package:flutter/material.dart';
import 'package:serializable_controllers/serializable_controllers.dart';
class MyFormPage extends StatefulWidget {
[@override](/user/override)
_MyFormPageState createState() => _MyFormPageState();
}
class _MyFormPageState extends State<MyFormPage> {
SerializableTextEditingController _textController = SerializableTextEditingController();
[@override](/user/override)
void dispose() {
_textController.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Serializable Controllers Example'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
TextField(
controller: _textController,
decoration: InputDecoration(labelText: 'Enter some text'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// 序列化控制器
Map<String, dynamic> serialized = _textController.toJson();
print('Serialized Controller: $serialized');
// 反序列化控制器
SerializableTextEditingController deserializedController = SerializableTextEditingController.fromJson(serialized);
print('Deserialized Controller Text: ${deserializedController.text}');
},
child: Text('Serialize and Deserialize'),
),
],
),
),
);
}
}
3. 序列化和反序列化
在上面的示例中,我们创建了一个 SerializableTextEditingController
,并在按钮的 onPressed
回调中将其序列化为 JSON。然后,我们从 JSON 反序列化一个新的控制器并打印其文本。
4. 保存和恢复状态
在实际应用中,你可能会将序列化的控制器状态保存到本地存储(如 SharedPreferences
)中,并在应用重新启动时恢复它。
import 'package:shared_preferences/shared_preferences.dart';
void saveControllerState(SerializableTextEditingController controller) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('controllerState', controller.toJson().toString());
}
Future<SerializableTextEditingController> loadControllerState() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String? controllerState = prefs.getString('controllerState');
if (controllerState != null) {
return SerializableTextEditingController.fromJson(Map<String, dynamic>.from(controllerState));
}
return SerializableTextEditingController();
}
5. 使用保存和恢复状态
你可以在 initState
和 dispose
方法中调用保存和恢复状态的函数。
class _MyFormPageState extends State<MyFormPage> {
SerializableTextEditingController _textController = SerializableTextEditingController();
[@override](/user/override)
void initState() {
super.initState();
loadControllerState().then((controller) {
setState(() {
_textController = controller;
});
});
}
[@override](/user/override)
void dispose() {
saveControllerState(_textController);
_textController.dispose();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
// 构建UI
}
}