我正在尝试创建类似可拖动滑块的小部件(例如确认滑块)。我的问题是是否有办法限制可拖动区域?
import 'package:flutter/material.dart'; import 'confirmation_slider.dart'; void main() => runApp(new MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( home: new Scaffold( body: new ListView( children: <Widget>[ new Container( margin: EdgeInsets.only( top: 50.0 ), ), new Container( margin: EdgeInsets.only( left: 50.0, right: 50.0 ), child: new Draggable( axis: Axis.horizontal, child: new FlutterLogo(size: 50.0), feedback: new FlutterLogo(size: 50.0), ), height: 50.0, color: Colors.green ), ], ), ), ); } }
我以为容器类将约束可拖动区域,但似乎没有做到这一点。
不,那不是Draggable小部件的目标。而是使用a GestureDetector来检测阻力。然后将其与类似Align内容移动的内容结合起来
Draggable
GestureDetector
Align
这是一个基于您当前代码的完全可用的滑块。
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: Slider(), ), ), ); } } class Slider extends StatefulWidget { final ValueChanged<double> valueChanged; Slider({this.valueChanged}); @override SliderState createState() { return new SliderState(); } } class SliderState extends State<Slider> { ValueNotifier<double> valueListener = ValueNotifier(.0); @override void initState() { valueListener.addListener(notifyParent); super.initState(); } void notifyParent() { if (widget.valueChanged != null) { widget.valueChanged(valueListener.value); } } @override Widget build(BuildContext context) { return Container( color: Colors.green, height: 50.0, padding: EdgeInsets.symmetric(horizontal: 40.0), child: Builder( builder: (context) { final handle = GestureDetector( onHorizontalDragUpdate: (details) { valueListener.value = (valueListener.value + details.delta.dx / context.size.width) .clamp(.0, 1.0); }, child: FlutterLogo(size: 50.0), ); return AnimatedBuilder( animation: valueListener, builder: (context, child) { return Align( alignment: Alignment(valueListener.value * 2 - 1, .5), child: child, ); }, child: handle, ); }, ), ); } }