1

单击单击时如何禁用 onTap 功能。使用颤振。

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

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,
          });
        });
      },
    );
  }
}
4

4 回答 4

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
    });
  }
},
于 2021-12-22T03:16:00.493 回答
0

请参考以下代码

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

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(() {});
            },
          ),
        )


于 2021-12-22T05:42:35.553 回答
0

你可以做出这样的条件: -

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

bool isClicked = true;

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

   } 
  child: Container(),
)
于 2021-12-28T10:50:07.210 回答
0

为了真正禁用onTap处理程序,您必须传递nullonTap. 我会在这个类中创建一个变量来跟踪是否onTap已经按下,如果已经按下,传递nullonTap而不是你的回调函数。

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而不是传递nullonTap. 这种方法将禁用 上的所有处理程序ListTile,而不仅仅是onTap(例如,您可能还有一个onLongPress处理程序)。它还将更新样式以使用disabled当前Theme.

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,
    });
  });
},
于 2021-12-22T04:05:16.003 回答