gpt4 book ai didi

flutter 有向图。我可以将 CustomPainter 类与自定义小部件一起使用吗?

转载 作者:行者123 更新时间:2023-12-02 14:13:05 27 4
gpt4 key购买 nike

我想用 flutter 构建一个如下图所示的有向图。我不知道从哪里开始。我在互联网上搜索没有成功。这种图需要哪些算法?我尝试使用自定义画家类构建此图。我不知道如何在自定义画家类中使用自定义小部件。 (例如,旁边有人物图片和文字的矩形)。我只能画矩形和线条......缩放和平移我认为我可以使用 GestureDetector 类来完成。该图表应该是动态可定制的。

enter image description here

最佳答案

您需要拆分任务。

  1. 使图层能够缩放和移动整个场景,可以使用带有 onScale 事件的 GestureDetector 小部件 + Transform.scale 小部件,(检查zoom_widget包)。
  2. 使单个项目可拖动。使用 GestureDetector + onPan 事件。
  3. 使用 CustomPainter 在元素之间绘制连接线。我直接用线条来展示主要逻辑。

..添加额外的逻辑如何添加新项目。

更新: codepen interactive version由@maks 创建

enter image description here

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: Container(
alignment: Alignment.center,
child: ItemsScene(),
decoration: BoxDecoration(
border: Border.all(
color: Colors.blueAccent,
),
),
),
),
),
);
}
}

class ItemsScene extends StatefulWidget {
@override
_ItemsSceneState createState() => _ItemsSceneState();
}

class _ItemsSceneState extends State<ItemsScene> {
List<ItemModel> items = [
ItemModel(offset: Offset(70, 100), text: 'text1'),
ItemModel(offset: Offset(200, 100), text: 'text2'),
ItemModel(offset: Offset(200, 230), text: 'text3'),
];

Function onDragStart(int index) => (x, y) {
setState(() {
items[index] = items[index].copyWithNewOffset(Offset(x, y));
});
};

@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
CustomPaint(
size: Size(double.infinity, double.infinity),
painter: CurvedPainter(
offsets: items.map((item) => item.offset).toList(),
),
),
..._buildItems()
],
);
}

List<Widget> _buildItems() {
final res = <Widget>[];
items.asMap().forEach((ind, item) {
res.add(_Item(
onDragStart: onDragStart(ind),
offset: item.offset,
text: item.text,
));
});

return res;
}
}

class _Item extends StatelessWidget {
_Item({
Key key,
this.offset,
this.onDragStart,
this.text,
});

final double size = 100;
final Offset offset;
final Function onDragStart;
final String text;

_handleDrag(details) {
print(details);
var x = details.globalPosition.dx;
var y = details.globalPosition.dy;
onDragStart(x, y);
}

@override
Widget build(BuildContext context) {
return Positioned(
left: offset.dx - size / 2,
top: offset.dy - size / 2,
child: GestureDetector(
onPanStart: _handleDrag,
onPanUpdate: _handleDrag,
child: Container(
width: size,
height: size,
child: Text(text),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(
color: Colors.blueAccent,
),
),
),
),
);
}
}

class CurvedPainter extends CustomPainter {
CurvedPainter({this.offsets});

final List<Offset> offsets;

@override
void paint(Canvas canvas, Size size) {
if (offsets.length > 1) {
offsets.asMap().forEach((index, offset) {
if (index == 0) return;
canvas.drawLine(
offsets[index - 1],
offsets[index],
Paint()
..color = Colors.red
..strokeWidth = 2,
);
});
}
}

@override
bool shouldRepaint(CurvedPainter oldDelegate) => true;
}

class ItemModel {
ItemModel({this.offset, this.text});

final Offset offset;
final String text;

ItemModel copyWithNewOffset(Offset offset) {
return ItemModel(offset: offset, text: text);
}
}

关于 flutter 有向图。我可以将 CustomPainter 类与自定义小部件一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59717952/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com