我正在制作一个应用程序,但我希望整个应用程序只能接收一次触摸。例如,如果该应用程序有2个可拖动容器,则我只希望一个容器可拖动,因为我希望整个应用程序一次只注册1次触摸。这可能吗?
这里有一些代码(简体),有人可以向我展示如何使用这个简单的示例代码吗?因此,我可以弄清楚如何使用更复杂的代码来做到这一点?谢谢!
import 'package:flutter/material.dart';
class MyTest extends StatefulWidget {
@override
_MyTestState createState() => _MyTestState();
}
class _MyTestState extends State<MyTest> {
int myTestInt = 1;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.indigo,
body: Center(
child: Column(
children: <Widget>[
Text('test'),
Text('test'),
Text('$myTestInt'),
],
),
),
);
}
}
这是我为您提供解决方案的尝试(可能是错误的,抱歉,我对此很陌生:):
import 'package:flutter/material.dart';
import 'my_widget.dart';
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
bool isPressed = false;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.indigoAccent,
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
InkWell(
onLongPress: () {
if (isPressed == false) {
setState(() {
isPressed = true;
});
}
},
child: Container(
child: Padding(
padding: EdgeInsets.all(30),
child: Center(
child:
DragTarget<dynamic>(builder: (context, accepted, rejected) {
return Draggable(
maxSimultaneousDrags: 1,
child: Container(
height: 50,
width: 50,
color: Colors.pink,
),
feedback: Container(
height: 50,
width: 50,
color: Colors.pink,
),
childWhenDragging: Container(
height: 50,
width: 50,
color: Colors.yellowAccent,
),
);
}),
),
),
),
),
InkWell(
onLongPress: () {
if (isPressed == false) {
setState(() {
isPressed = true;
});
}
},
child: Container(
child: Padding(
padding: EdgeInsets.all(30),
child: Center(
child:
DragTarget<dynamic>(builder: (context, accepted, rejected) {
return Draggable(
maxSimultaneousDrags: 1,
child: Container(
height: 50,
width: 50,
color: Colors.pink,
),
feedback: Container(
height: 50,
width: 50,
color: Colors.pink,
),
childWhenDragging: Container(
height: 50,
width: 50,
color: Colors.yellowAccent,
),
);
}),
),
),
),
),
],
),
);
}
}
新代码的另一次更新:main.dart:
import 'package:flutter/material.dart';
import 'package:flutterdragtest/home_screen.dart';
import 'package:flutter/services.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIOverlays ([]);
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: HomeScreen(),
);
}
}
home_screen.dart:
import 'package:flutter/material.dart';
import 'my_widget.dart';
import 'my_class.dart';
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
void reload() {
print('Reload');
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.indigoAccent,
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
MyWidget(id: 1, reload: reload,),
MyWidget(id: 2, reload: reload,),
MyWidget(id: 3, reload: reload,),
],
),
);
}
}
my_widget.dart :(我知道这是超级糟糕的代码,但它只是测试中)
import 'package:flutter/material.dart';
import 'package:flutterdragtest/my_class.dart';
class MyWidget extends StatefulWidget {
final int id;
final Function reload;
MyWidget({@required this.id, @required this.reload});
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
bool whichAbsorb() {
switch (widget.id) {
case 1: {
return CircleData.dk1;
}
break;
case 2: {
return CircleData.dk2;
}
break;
case 3: {
return CircleData.dk3;
}
break;
}
}
void setAbsorb() {
switch (widget.id) {
case 1: {
setState(() {
CircleData.dk1 = false;
CircleData.dk2 = true;
CircleData.dk3 = true;
});
}
break;
case 2: {
setState(() {
CircleData.dk1 = true;
CircleData.dk2 = false;
CircleData.dk3 = true;
});
}
break;
case 3: {
setState(() {
CircleData.dk1 = true;
CircleData.dk2 = true;
CircleData.dk3 = false;
});
}
break;
}
}
void clearAbsorb() {
setState(() {
CircleData.dk1 = false;
CircleData.dk2 = false;
CircleData.dk3 = false;
});
}
bool blockCheck() {
switch (widget.id) {
case 1: {
if (CircleData.dk1 == false) {
return true;
}
else {
return false;
}
}
break;
case 2: {
if (CircleData.dk2 == false) {
return true;
}
else {
return false;
}
}
break;
case 3: {
if (CircleData.dk3 == false) {
return true;
}
else {
return false;
}
}
break;
}
}
@override
Widget build(BuildContext context) {
return AbsorbPointer(
absorbing: whichAbsorb(),
child: Padding(
padding: EdgeInsets.all(40),
child: Center(
child: DragTarget<dynamic>(
builder: (context, accepted, rejected){
if (blockCheck()) {
return GestureDetector(
onTapDown: (_) {
setAbsorb(); widget.reload();
},
child: Draggable(
onDragStarted: () {setAbsorb(); widget.reload();},
onDragCompleted: () {clearAbsorb(); widget.reload();},
onDraggableCanceled: (e, q) {clearAbsorb(); widget.reload();},
maxSimultaneousDrags: 1,
child: Container(height: 50, width: 50, color: Colors.pink,),
feedback: Container(height: 50, width: 50, color: Colors.pink,),
childWhenDragging: Container(height: 50, width: 50, color: Colors.yellowAccent,),
),
);
}
else {
return Container(height: 50, width: 50, color: Colors.green,);
}
}
),
),
),
);
}
}
my_class.dart:
class CircleData {
static int num;
static bool dk1 = false;
static bool dk2 = false;
static bool dk3 = false;
}
用墨水瓶包装每个容器并添加一个布尔值将达到目的。
首先在Widget Build
顶部添加布尔值:
bool isPressed=false;
尝试一下:
InkWell(
onLongPress: () {
if(isPressed==false){
setState(() {
isPressed=true;
});
//do something
}
}
)
您也可以用GestureDetector包裹它。但是,每次单击该容器都不会产生任何动画。
GestureDetector(
onLongPress: () {
if(isPressed==false){
setState(() {
isPressed=true;
});
//do something
},
}
)
我还建议在创建每个容器时使用ListView.builder,而不是手动一个个地输入它们。示例:
首先在Widget Build方法上方生成一个数组:
final items = List<String>.generate(100, (i) => "Item $i");
将其放置在脚手架内或容器内:
ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return ListTile( //you can change this to a container
title: Text('${items[index]}'),
);
},
);