在堆栈中添加可拖动小部件时,防止已有的可拖动小部件改变其位置的关键在于正确使用Matrix4转换。下面是一种可能的解决方案:
以下是一个示例代码:
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:vector_math/vector_math_64.dart' show Vector3;
class DraggableWidget extends StatefulWidget {
@override
_DraggableWidgetState createState() => _DraggableWidgetState();
}
class _DraggableWidgetState extends State<DraggableWidget> {
Matrix4 _transform = Matrix4.identity();
Offset _startPosition;
@override
Widget build(BuildContext context) {
return GestureDetector(
onPanStart: (details) {
_startPosition = details.globalPosition;
},
onPanUpdate: (details) {
final currentPosition = details.globalPosition;
final delta = currentPosition - _startPosition;
setState(() {
_transform = Matrix4.translationValues(delta.dx, delta.dy, 0);
});
},
onPanEnd: (_) {
_startPosition = null;
// You can save the final position here if needed.
},
child: Transform(
transform: _transform,
child: Container(
width: 100,
height: 100,
color: Colors.blue,
),
),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Draggable Widget'),
),
body: Stack(
children: [
Positioned(
top: 100,
left: 100,
child: DraggableWidget(),
),
// Add more draggable widgets here.
],
),
);
}
}
void main() {
runApp(MaterialApp(home: MyHomePage()));
}
在这个示例中,我们创建了一个DraggableWidget小部件,并使用Matrix4转换来设置其初始位置。通过捕获手势事件,我们可以计算出位移量,并根据位移量更新小部件的位置。当手势结束时,我们可以保存最终位置,以备将来使用。
请注意,这只是一种解决方案,具体取决于您的实际需求和代码结构。有关更多详细信息和示例,请参阅Flutter官方文档和相关教程。
领取专属 10元无门槛券
手把手带您无忧上云