几天没事学习了一个在Flutter当中可以拖动的组件,DragTarget是用于接受Draggable数据的Widget。当Draggable被拖动到DragTarget上方并松手,DragTarget会根据传递过来的数据判断是否需要接受该数据。DragTarget本身也是一个StatefulWidget,可以根据接收到的数据进行改变。
本头条核心宗旨
欢迎来到「技术刚刚好」作者,「技术刚刚好」是个人维护,每天至少更新一篇Flutter技术文章,实时为大家播报Flutter最新消息。如果你刚好也在关注Flutter这门技术,那就跟我一起学习进步吧,你的赞,收藏,转发是对我个人最大的支持,维护不易,欢迎关注。
技术刚刚好经历
近几年,移动端跨平台开发技术层出不穷,从Facebook家的ReactNative,到阿里家WEEX,前端技术在移动端跨平台开发中大展身手,技术刚刚好作为一名Android开发,经历了从Reactjs到Vuejs的不断学习。而在2018年,我们的主角变成了Flutter,这是Goolge开源的一个移动端跨平台解决方案,可以快速开发精美的移动App。希望跟大家一起学习,一起进步!
本文核心要点
import \'package:flutter/material.dart\';
import \'draggable_demo.dart\';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: \'Flutter Demo\',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: DraggableDemo(),
);
}
}
/**
* Draggable能够让您的小部件被用户拖拽
* 并能获取拖拽的位置信息
* Positioned能够对根据偏移量offset进行定位
* 而Draggable的child是它被拖动前的样子
* feedback是它被拖动时的样子,这里在颜色上加了opacity进行了区分
* 而data是他在拖动到DragTarget将会传递的参数
* 在DragTarget中,可以通过onAccept获取这个data
*
* 这里在拖拽结束时会调用onDraggableCanceled,
* 并传入被拖拽后的偏移量offset
* 我们刷新这个offset就改变了Positioned的位置
*/
import \'package:flutter/material.dart\';
class DraggableWidget extends StatefulWidget {
final Offset offset;
final Color widgetColor;
const DraggableWidget({Key key, this.offset, this.widgetColor}) : super(key: key);
@override
_DraggableWidgetState createState() => _DraggableWidgetState();
}
class _DraggableWidgetState extends State<DraggableWidget> {
Offset offset = Offset(0.0, 0.0);
@override
void initState() {
super.initState();
offset = widget.offset;
}
@override
Widget build(BuildContext context) {
return Positioned(
left: offset.dx,
top: offset.dy,
child: Draggable(
data: widget.widgetColor,
child: Container(
width: 100.0,
height: 100.0,
color: widget.widgetColor,
),
feedback: Container(
width: 100.0,
height: 100.0,
color: widget.widgetColor.withOpacity(0.5),
),
onDraggableCanceled: (Velocity velocity, Offset offset){
setState(() {
this.offset = offset;
});
},
)
);
}
}
import \'package:flutter/material.dart\';
import \'draggable_widget.dart\';
class DraggableDemo extends StatefulWidget {
@override
_DraggableDemoState createState() => _DraggableDemoState();
}
class _DraggableDemoState extends State<DraggableDemo> {
Color _draggableColor = Colors.grey;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: <Widget>[
DraggableWidget(
offset: Offset(100.0, 100.0),
widgetColor: Colors.tealAccent,
),
DraggableWidget(
offset: Offset(200.0, 100.0),
widgetColor: Colors.redAccent,
),
Center(
child: DragTarget(onAccept: (Color color) {
_draggableColor = color;
}, builder: (context, candidateData, rejectedData) {
return Container(
width: 200.0,
height: 200.0,
color: _draggableColor,
);
}),
)
],
));
}
}
谢谢观看技术刚刚好的文章,技术刚刚好是个人维护,每天至少更新一篇Flutter技术文章,实时为大家播报Flutter最新消息。如果你刚好也在关注Flutter这门技术,那就跟我一起学习进步吧,你的赞,收藏,转发是对我个人最大的支持,维护不易,欢迎关注。
本文系本站编辑转载,文章版权归原作者所有,内容为作者个人观点,转载目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请与本站联系,本站将在第一时间删除内容!