Flutter键值编辑器插件most_key_value_editor的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter键值编辑器插件most_key_value_editor的使用

特性

  • 高度可定制
  • 开箱即用的基本类型支持:
    • 布尔值
      { "type": "boolean" }
      
    • 字符串
      { "type": "string" }
      
    • 枚举
      { "type": "string", "enumValues": ["a", "b", "c"] }
      
    • 数字
      { "type": "number" }
      { "type": "integer" }
      
    • 数组
      { "type": "array", "items": { "type": "string" } }
      
  • 开箱即用的验证支持
  • 功能丰富的编辑控制器
  • 内置搜索栏以实现更快导航

most_key_value_editor logo most_key_value_editor screenshot

使用方法

  1. 创建 JsonSchema 对象;
  2. JsonSchema 转换为 MostJsonSchema
  3. 在小部件树中添加 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'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个Flutter应用,并在pubspec.yaml中添加了most_key_value_editor插件的依赖。
  2. MyApp类中,我们设置了应用的主题和主屏幕KeyValueEditorScreen
  3. KeyValueEditorScreen是一个有状态的widget,它管理一个_keyValues列表,该列表存储键值对数据。
  4. initState方法中,我们将初始数据复制到_keyValues列表中。
  5. MostKeyValueEditor widget用于显示和编辑键值对数据。当用户更改数据时,onChanged回调会被触发,更新_keyValues列表。
  6. 一个ElevatedButton用于提交数据,点击按钮时会打印出当前的键值对数据。

这个示例展示了如何使用most_key_value_editor插件来创建一个简单的键值编辑器界面,并处理用户输入的数据。你可以根据实际需求进一步定制和扩展这个示例。

回到顶部