Flutter键值编辑器插件most_key_value_editor的使用
Flutter键值编辑器插件most_key_value_editor的使用
特性
- 高度可定制
- 开箱即用的基本类型支持:
- 布尔值
{ "type": "boolean" }
- 字符串
{ "type": "string" }
- 枚举
{ "type": "string", "enumValues": ["a", "b", "c"] }
- 数字
{ "type": "number" } { "type": "integer" }
- 数组
{ "type": "array", "items": { "type": "string" } }
- 布尔值
- 开箱即用的验证支持
- 功能丰富的编辑控制器
- 内置搜索栏以实现更快导航
使用方法
- 创建
JsonSchema
对象; - 将
JsonSchema
转换为MostJsonSchema
; - 在小部件树中添加
MostKeyValueEditor
并提供MostJsonSchema
。
以下是一个完整的示例演示如何使用 most_key_value_editor
插件:
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
// ignore: depend_on_referenced_packages
import 'package:json_schema/json_schema.dart';
import 'package:most_key_value_editor/most_key_value_editor.dart';
void main() {
runApp(const ExampleApp());
}
class ExampleApp extends StatelessWidget {
const ExampleApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Editor',
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const EditorPage(
initialJson: {
"person": {
"last_name": "Doe",
"gender": "alien",
"age": 42,
},
"ipv4": "0.0.0.256",
},
initialJsonSchema: {
"title": "Person",
"required": [
"person",
"admin",
"ipv4",
],
"properties": {
"person": {
"type": "object",
"required": [
"first_name",
"last_name",
"nicknames",
"gender",
"age",
],
"properties": {
"first_name": {"type": "string"},
"last_name": {"type": "string"},
"nicknames": {
"type": "array",
"items": {"type": "string"},
},
"gender": {
"type": "string",
"enum": ["male", "female", "prefer not to say"]
},
"age": {
"description":
"年龄必须等于或大于零。",
"type": "integer",
"minimum": 0
},
},
},
"admin": {"type": "boolean"},
"ipv4": {
"title": "IP",
"type": "string",
"pattern":
r"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"
},
},
},
),
);
}
}
class EditorPage extends StatefulWidget {
final Map<String, dynamic> initialJson;
final Map<String, dynamic> initialJsonSchema;
const EditorPage({
super.key,
required this.initialJson,
required this.initialJsonSchema,
});
JsonSchema get jsonSchema => JsonSchema.create(initialJsonSchema);
[@override](/user/override)
State<EditorPage> createState() => _EditorPageState();
}
class _EditorPageState extends State<EditorPage> {
late final MostKeyValueEditorController controller;
[@override](/user/override)
void initState() {
super.initState();
controller = MostKeyValueEditorController(
initialState: EditorState.fromAccessor(JsonAccessor()),
onChangedTransformer: ValidateCommand(
const EditorStateValidator.merge([
PropertiesValidator(),
UnspecifiedPropertiesValidator(),
JsonSchemaValidator(),
MockNameValidator(),
]),
),
);
// 初始化控制器状态
controller
..executeCommand(SeedJsonCommand(widget.initialJson))
..executeCommand(SeedJsonSchemaCommand(widget.jsonSchema));
}
[@override](/user/override)
void dispose() {
controller.dispose();
super.dispose();
}
// 复制到剪贴板的方法
void _copyToClipboard(MostKeyValueEditorController controller) {
final map = controller.jsonAccessor.read();
Clipboard.setData(ClipboardData(text: json.encode(map)));
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Editor Demo'),
actions: [
Padding(
padding: const EdgeInsets.all(8.0),
child: ElevatedButton.icon(
onPressed: () => _copyToClipboard(controller),
label: const Text('复制'),
icon: const Icon(Icons.copy),
),
),
],
),
body: Center(
child: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 800),
child: MostKeyValueEditor(
controller: controller,
inputBuilders: const [],
),
),
),
);
}
}
// 自定义验证器,用于验证名字是否为“John Doe”
class MockNameValidator extends EditorStateValidator {
const MockNameValidator();
[@override](/user/override)
List<ValidationMessage> validate(EditorState state) {
final firstName = state.jsonAccessor.getValue('person.first_name');
final lastName = state.jsonAccessor.getValue('person.last_name');
return firstName == "John" && lastName == "Doe"
? [
const ValidationMessage.propertyError(
path: "person.first_name",
message: "请使用真实姓名",
),
const ValidationMessage.propertyError(
path: "person.last_name",
message: "请使用真实姓名",
),
]
: [];
}
}
更多关于Flutter键值编辑器插件most_key_value_editor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter键值编辑器插件most_key_value_editor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,我可以为你提供一个关于如何在Flutter项目中使用most_key_value_editor
插件的代码示例。most_key_value_editor
是一个用于Flutter的键值编辑器插件,允许用户以键值对的形式输入和管理数据。
首先,你需要在你的pubspec.yaml
文件中添加这个插件的依赖:
dependencies:
flutter:
sdk: flutter
most_key_value_editor: ^最新版本号 # 请替换为实际的最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,下面是一个简单的示例代码,展示如何在Flutter应用中使用most_key_value_editor
:
import 'package:flutter/material.dart';
import 'package:most_key_value_editor/most_key_value_editor.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Key-Value Editor Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: KeyValueEditorScreen(),
);
}
}
class KeyValueEditorScreen extends StatefulWidget {
@override
_KeyValueEditorScreenState createState() => _KeyValueEditorScreenState();
}
class _KeyValueEditorScreenState extends State<KeyValueEditorScreen> {
final List<KeyValue> _initialData = [
KeyValue(key: 'Name', value: 'John Doe'),
KeyValue(key: 'Age', value: '30'),
KeyValue(key: 'Email', value: 'john.doe@example.com'),
];
List<KeyValue> _keyValues = [];
@override
void initState() {
super.initState();
_keyValues = List.from(_initialData);
}
void _submitData() {
// 处理提交的数据
print('Submitted Data: $_keyValues');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Key-Value Editor Demo'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Expanded(
child: MostKeyValueEditor(
keyValues: _keyValues,
onChanged: (List<KeyValue> keyValues) {
setState(() {
_keyValues = keyValues;
});
},
),
),
SizedBox(height: 16),
ElevatedButton(
onPressed: _submitData,
child: Text('Submit'),
),
],
),
),
);
}
}
在这个示例中:
- 我们创建了一个Flutter应用,并在
pubspec.yaml
中添加了most_key_value_editor
插件的依赖。 - 在
MyApp
类中,我们设置了应用的主题和主屏幕KeyValueEditorScreen
。 KeyValueEditorScreen
是一个有状态的widget,它管理一个_keyValues
列表,该列表存储键值对数据。- 在
initState
方法中,我们将初始数据复制到_keyValues
列表中。 MostKeyValueEditor
widget用于显示和编辑键值对数据。当用户更改数据时,onChanged
回调会被触发,更新_keyValues
列表。- 一个
ElevatedButton
用于提交数据,点击按钮时会打印出当前的键值对数据。
这个示例展示了如何使用most_key_value_editor
插件来创建一个简单的键值编辑器界面,并处理用户输入的数据。你可以根据实际需求进一步定制和扩展这个示例。