如何在单击一次后禁用onTap功能.使用颤振



单击后如何禁用onTap功能。使用Flutter。

这是我下面的代码,请帮我检查一下。。。

class VoteCalonUmumPage extends StatelessWidget {
const VoteCalonUmumPage({Key? key, required this.title}) : super(key: key);

final String title;
Widget _buildListItem(BuildContext context, DocumentSnapshot document) {
return ListTile(
tileColor: Color(0xff99c2ec),
title: Row(
children: [
Expanded(
child: Text(document['name'],
style: TextStyle(
color: Colors.black87,
fontSize: 20,
)),
),
Container(
decoration: const BoxDecoration(
color: Color(0xffecc399),
),
padding: const EdgeInsets.all(10.0),
child: Text(
document['votes'].toString(),
style: Theme.of(context).textTheme.headline4,
),
),
],
),
onTap: () {
FirebaseFirestore.instance.runTransaction((transaction) async {
DocumentSnapshot freshSnap =
await transaction.get(document.reference);
await transaction.update(freshSnap.reference, {
'votes': freshSnap['votes'] + 1,
});
});
},
);
}
}

检查下面的代码一个简单的逻辑它可能会帮助你,

bool isLoading = false; //global variable
onTap: () {
if(!isLoading)
{
isLoading = true;
try{
FirebaseFirestore.instance.runTransaction((transaction) async {
DocumentSnapshot freshSnap =  await transaction.get(document.reference);
await transaction.update(freshSnap.reference, {'votes': freshSnap['votes'] + 1,});
isLoading = false;
});
}catch((e){
isLoading = false
});
}
},

为了实际禁用onTap处理程序,必须将null传递给onTap。我会在这个类中创建一个变量来跟踪onTap是否已经被按下,如果已经按下,则将null传递给onTap,而不是您的回调函数。

onTap: onTapPressed ? null : () {
setState(() {
// call set state here so that the UI will be updated.
onTapPressed = true;
});
FirebaseFirestore.instance.runTransaction((transaction) async {
DocumentSnapshot freshSnap =
await transaction.get(document.reference);
await transaction.update(freshSnap.reference, {
'votes': freshSnap['votes'] + 1,
});
});
},

然后在您的小部件中添加此成员。

bool onTapPressed = false;

此外,ListTile还有一个名为enabled的可选参数,您可以将其设置为false,而不是将null传递给onTap。这种方法将禁用ListTile上的所有处理程序,而不仅仅是onTap(例如,您可能还有一个onLongPress处理程序(。它还将更新样式以使用当前Themedisabled颜色。

disabled: !onTapPressed,
onTap: () {
setState(() {
// call set state here so that the UI will be updated.
onTapPressed = true;
});
FirebaseFirestore.instance.runTransaction((transaction) async {
DocumentSnapshot freshSnap =
await transaction.get(document.reference);
await transaction.update(freshSnap.reference, {
'votes': freshSnap['votes'] + 1,
});
});
},

请参阅以下代码

IgnorePointer是flutter中的一个内置小部件,类似于AbsorbPointer小部件,它们都可以防止其子部件发生标记、单击、拖动、滚动和悬停等指针事件。IgnorePointer小部件只是忽略指针事件而不终止它,这意味着如果IgnorePPointer小部件树下有任何其他元素,那么它将能够经历该指针事件。

bool disableOnClick = false;
IgnorePointer(
ignoring: disableOnClick ?? false,
child: ListTile(
tileColor: Color(0xff99c2ec),
title: Row(
children: [
Expanded(
child: Text(document['name'],
style: TextStyle(
color: Colors.black87,
fontSize: 20,
)),
),
Container(
decoration: const BoxDecoration(
color: Color(0xffecc399),
),
padding: const EdgeInsets.all(10.0),
child: Text(
document['votes'].toString(),
style: Theme.of(context).textTheme.headline4,
),
),
],
),
onTap: () {
FirebaseFirestore.instance.runTransaction((transaction) async {
DocumentSnapshot freshSnap =
await transaction.get(document.reference);
await transaction.update(freshSnap.reference, {
'votes': freshSnap['votes'] + 1,
});
});
disableOnClick = true;
setState(() {});
},
),
)

您可以设置如下条件:-

设置一个bool变量并将其设置为true,当用户点击按钮时,如果您想永久禁用使用prefrences ,则设置为false

bool isClicked=true;

GestureDetector(
onTap:  (){
if(isClicked){
isClicked = true;
enter code here
}
} 
child: Container(),
)

相关内容

  • 没有找到相关文章

最新更新