单击后如何禁用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
处理程序(。它还将更新样式以使用当前Theme
的disabled
颜色。
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(),
)