Flutter节点编辑器插件node_editor的使用

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

Flutter节点编辑器插件node_editor的使用

介绍

node_editor 是一个高度可定制的Flutter节点编辑器,允许开发者通过Flutter小部件自定义节点和端口,提供无与伦比的UI灵活性。它支持交互式节点元素、可定制的连接和背景、动态端口逻辑、扩展设计以及跨平台兼容性。

特点

  • Flutter小部件用于节点和端口:使用任何Flutter小部件自定义节点和端口,提供极大的UI灵活性。
  • 交互式节点元素:直接在节点中嵌入交互式小部件(如文本框和复选框),实现动态用户输入。
  • 可定制的连接和背景:通过广泛的样式选项自定义连接和背景,确保视觉一致性。
  • 动态端口逻辑:高级端口连接逻辑,包括可定制的验证和无限连接容量。
  • 扩展设计:轻松添加新的节点和端口类型,确保可扩展性。
  • 跨平台兼容性:利用Flutter的跨平台能力,一次构建,随处部署。

开始使用

要使用 node_editor 插件,只需在 pubspec.yaml 文件中添加依赖项:

dependencies:
  node_editor: ^0.0.5

或者使用命令行:

flutter pub add node_editor

使用示例

1. 初始化NodeEditor

首先,需要创建一个 FocusNodeNodeEditorController,然后将其传递给 NodeEditor 小部件:

import 'package:flutter/material.dart';
import 'package:node_editor/node_editor.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: NodeEditorExample(),
    );
  }
}

class NodeEditorExample extends StatefulWidget {
  [@override](/user/override)
  _NodeEditorExampleState createState() => _NodeEditorExampleState();
}

class _NodeEditorExampleState extends State<NodeEditorExample> {
  final NodeEditorController _controller = NodeEditorController();
  final FocusNode _focusNode = FocusNode();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Node Editor Example')),
      body: Column(
        children: [
          Expanded(
            child: NodeEditor(
              focusNode: _focusNode,
              controller: _controller,
              background: const GridBackground(), // 可选的网格背景
            ),
          ),
          ElevatedButton(
            onPressed: () {
              // 添加一个节点
              _addNode();
            },
            child: Text('Add Node'),
          ),
        ],
      ),
    );
  }

  void _addNode() {
    final newNode = exampleNode('Node 1');
    _controller.addNode(newNode, NodePosition.afterLast);
  }

  NodeWidgetBase exampleNode(String name) {
    return ContainerNodeWidget(
      name: name,
      typeName: 'node_3',
      backgroundColor: Colors.blue.shade800,
      radius: 10,
      width: 200,
      contentPadding: const EdgeInsets.all(4),
      selectedBorder: Border.all(color: Colors.white),
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [
          Column(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              InPortWidget(
                name: 'PortIn1',
                onConnect: (String name, String port) => true,
                icon: Icon(
                  Icons.circle_outlined,
                  color: Colors.yellowAccent,
                  size: 20,
                ),
                iconConnected: Icon(
                  Icons.circle,
                  color: Colors.yellowAccent,
                  size: 20,
                ),
                multiConnections: false,
                connectionTheme: ConnectionTheme(
                  color: Colors.yellowAccent,
                  strokeWidth: 2,
                ),
              ),
            ],
          ),
          Icon(Icons.safety_divider),
          OutPortWidget(
            name: 'PortOut1',
            icon: Icon(
              Icons.pause_circle_outline,
              color: Colors.deepOrange,
              size: 24,
            ),
            iconConnected: Icon(
              Icons.pause_circle,
              color: Colors.deepOrange,
              size: 24,
            ),
            multiConnections: false,
            connectionTheme: ConnectionTheme(
              color: Colors.deepOrange,
              strokeWidth: 2,
            ),
          ),
        ],
      ),
    );
  }
}

更多关于Flutter节点编辑器插件node_editor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter节点编辑器插件node_editor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用node_editor插件的示例代码。这个插件允许你创建一个图形化的节点编辑器。以下是一个简单的示例,展示如何设置和使用node_editor

首先,确保你已经在pubspec.yaml文件中添加了node_editor依赖:

dependencies:
  flutter:
    sdk: flutter
  node_editor: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以创建一个Flutter应用并使用node_editor。以下是一个完整的示例:

import 'package:flutter/material.dart';
import 'package:node_editor/node_editor.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Node Editor Example'),
        ),
        body: NodeEditorScreen(),
      ),
    );
  }
}

class NodeEditorScreen extends StatefulWidget {
  @override
  _NodeEditorScreenState createState() => _NodeEditorScreenState();
}

class _NodeEditorScreenState extends State<NodeEditorScreen> {
  final NodeEditorController _controller = NodeEditorController();

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: NodeEditor(
        controller: _controller,
        nodeDataBuilder: (id) {
          // 根据id返回节点数据
          return NodeData(
            id: id,
            title: 'Node $id',
            inputs: [
              NodeInput(id: 'input_$id', title: 'Input $id'),
            ],
            outputs: [
              NodeOutput(id: 'output_$id', title: 'Output $id'),
            ],
            position: Offset(id * 100.0, id * 100.0), // 设置节点位置
            widget: Container(
              decoration: BoxDecoration(
                border: Border.all(color: Colors.black),
                borderRadius: BorderRadius.circular(8.0),
              ),
              padding: const EdgeInsets.all(8.0),
              child: Center(child: Text('Node $id')),
            ),
          );
        },
        onNodeCreated: (nodeData) {
          // 节点创建时的回调
          print('Node created: ${nodeData.title}');
        },
        onConnectionCreated: (inputId, outputId) {
          // 连接创建时的回调
          print('Connection created: $inputId -> $outputId');
        },
        onConnectionRemoved: (inputId, outputId) {
          // 连接移除时的回调
          print('Connection removed: $inputId -> $outputId');
        },
      ),
    );
  }
}

解释

  1. 依赖添加:在pubspec.yaml中添加node_editor依赖。
  2. 主应用:创建一个基本的Flutter应用,包含一个Scaffold和一个NodeEditorScreen
  3. NodeEditorScreen:这是一个有状态的widget,它包含一个NodeEditor和一个NodeEditorController
  4. NodeEditor
    • controller:用于控制节点编辑器的行为。
    • nodeDataBuilder:根据节点的id构建节点数据,包括标题、输入、输出、位置和自定义的widget。
    • onNodeCreated:节点创建时的回调,可以用于处理节点创建后的逻辑。
    • onConnectionCreated:连接创建时的回调,可以用于处理连接创建后的逻辑。
    • onConnectionRemoved:连接移除时的回调,可以用于处理连接移除后的逻辑。

这个示例展示了如何设置基本的节点编辑器,包括节点的创建、连接和自定义节点widget。你可以根据需要进一步扩展和自定义节点编辑器。

回到顶部