首页 > 解决方案 > 我怎样才能让 on ttap 按钮只被按下一次?- 颤振

问题描述

我遇到了颤振问题,并且 isComplet 布尔运行不正常。当我在应用程序中按两次它时,它会在您点击那里时多次执行任务。我该如何解决?这是整个代码。该todos列表是要在任务应用程序中执行的任务列表,但它工作正常:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:mrplan/loading.dart';
import 'package:mrplan/services/database_services.dart';
import 'package:mrplan/src/models/todo.dart';
import 'package:mrplan/src/pages/graficas_circulares_page.dart';
import 'package:mrplan/src/widgets/appbar.dart';



bool isComplet = false;
      TextEditingController todoTitleController = TextEditingController();
class Todolist extends StatefulWidget {

  @override
  _TodolistState createState() => _TodolistState();
}

class _TodolistState extends State<Todolist> {




      TextEditingController todoTitleController = TextEditingController();
  @override
  Widget build(BuildContext context) {
setState(() {
      
    });
    
    return Scaffold(
      body: SafeArea(
        child: StreamBuilder<List<Todo>>(
          stream: DatabaseService().listTodos(),
          builder: (context, snapshot) {
            if(!snapshot.hasData){
              return Loading();
               
            }
            
           
            
              List<Todo> todos = snapshot.data;
               
if(todos.length == 0){
              return Center(child: Text('No hay tareas agregadas!'));
              
               
            }

            return Padding(
              padding:EdgeInsets.all(0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  SizedBox(height: 20),
                  Expanded(
                    child: ListView.separated(
                      
                      separatorBuilder: (context, index)=> Divider(color: Colors.white),
                      shrinkWrap: true,
                      itemCount: todos.length,
                      itemBuilder: (context, index){
                      return Dismissible(
                        key: UniqueKey(),
                        background: Container(padding: EdgeInsets.only(left: 20),
                        alignment: Alignment.centerLeft,
                        child: Icon(Icons.delete),
                        color: Colors.red),
                        onDismissed: (direction) async {
                          await DatabaseService().removeTodo(todos[index].uid);
                        quitar();
                        
                        },
                        
                        child: StreamBuilder<DocumentSnapshot>(
                          stream: FirebaseFirestore.instance.collection('Todos').doc().snapshots(),
                          builder: (context, snapshot) {
                            var todoss = snapshot.data;
                            return ListTile(
                              onTap: (){
                                isComplet = !isComplet;
               if (Todo().isComplet = true)
               {DatabaseService().completTask(todos[index].uid);}
               if (Todo().isComplet = false)
               {DatabaseService().uncompletTask(todos[index].uid);}}, 
               
                              
                              leading: Container(
                                padding: EdgeInsets.all(2),
                                height: 30,
                                width: 30,
                                decoration: BoxDecoration(
                                  color: Theme.of(context).primaryColor,
                                  shape: BoxShape.circle
                                ),
                                child: todos[index].isComplet
                                ? Icon(
                                  Icons.check, 
                                  color: Colors.white,)
                                  : Container(),
                              ),
                              title: Text(
                                todos[index].title,
                                 
                              style: todos[index].isComplet 
                              ? TextStyle(
                                fontSize: 20,
                                fontWeight: FontWeight.w600,
                                
                                decoration: TextDecoration.lineThrough,
                                decorationColor: Colors.red,
                                )
                              : TextStyle(
                                fontSize: 20,
                                fontWeight: FontWeight.w600,
                                
                                decoration: null
                                ) 
                              ),

                            );
                          }
                        ),
                      );
                    }
                    ),
                  )
                ],
              ),
            );
          }
          
        )
        
      ),
    

          );
        }
      }
    
  
class Appbar extends StatefulWidget {
  @override
  _AppbarState createState() => _AppbarState();
}

class _AppbarState extends State<Appbar> {
  @override
  Widget build(BuildContext context) {
    bool isbuttondisabled = false;
    setState(() {
      
    });
    return StreamBuilder<Object>(
      stream: null,
      builder: (context, snapshot) {
        return Container(
          
          alignment: Alignment.bottomCenter,
          child: BottomAppBar(
            elevation: 0,
            child: Container(
              
              height: MediaQuery.of(context).size.height * 0.05,
              width: MediaQuery.of(context).size.width,
              child: Row(
                children: [
                  Container(
                    decoration: BoxDecoration(
                      color:Colors.grey[100],
                      borderRadius: BorderRadius.only(
                topLeft: const Radius.circular(5.0),
              )
            ),
                    
                    
                    height: MediaQuery.of(context).size.height,
                    padding: EdgeInsets.symmetric(horizontal: 10.0),
                     width: MediaQuery.of(context).size.width * 0.835,
                     child: Center(
                       child: TextFormField(
                         controller: todoTitleController,
                         autofocus: true,
                         decoration: InputDecoration(
                           hintStyle: TextStyle(color: Colors.blue[800]),
                         hintText: "Inserte una tarea...",
                         border: InputBorder.none
                         ),
                         ),
                     ),
                       ),

                       TextButton(
                         
                          child: Container(
                            height: MediaQuery.of(context).size.height,
                            child: Center(child: Icon(Icons.add))),
                          style: TextButton.styleFrom(
                            primary: Colors.white,
                            shape: RoundedRectangleBorder(
                              borderRadius: BorderRadius.only(
                topRight: const Radius.circular(10.0),
                
                
              )
                            ),
                            backgroundColor: Theme.of(context).primaryColor
                            ),
                            onPressed: isbuttondisabled ? null : ()async {
                              
                              if(todoTitleController.text.isNotEmpty){
                                await DatabaseService().createNewTodo(todoTitleController.text.trim());
                                FocusScope.of(context).unfocus();
                        anadir();
                        
                        todoTitleController.clear();
                          isComplet = !isComplet;



                            }

                          
                        
                      }
                       
                       
                       )
                                  ],
                                ),
            )
                              )
                              );
      }
    );
  }


}
  

我被困的相关代码是这样的:

onTap: (){
    isComplet = !isComplet;
    if (Todo().isComplet = true)
    {DatabaseService().completTask(todos[index].uid);}
    if (Todo().isComplet = false)
    {DatabaseService().uncompletTask(todos[index].uid);}}, 

非常感谢!

标签: firebasefluttergoogle-cloud-firestore

解决方案


如果你能稍微重构一下代码会更好。但是问题来了

在 build 方法中删除此代码

bool isbuttondisabled = false;
    setState(() {
      
    });

bool isbuttondisabled = false; 在构建方法之外添加。你的按钮在哪里,在 onPressed 参数中

setState(() {
      isbuttondisabled=true;
      //Todo add your code
    });```

推荐阅读