Flutter Messaging App - отключение иконки

У меня есть приложение для обмена сообщениями, где вы можете выбрать из списка пользователей для общения. На панели приложений есть кнопка со значком, с помощью которой вы можете подтвердить группу пользователей, которым вы хотите отправить сообщение. Прямо сейчас пользователь может спамить кнопку со значком несколько раз. Я хочу отключить значок кнопки после ее однократного нажатия. У меня есть переменная bool iconEnabled, но я не уверен, где разместить ее в onPressed.

return Scaffold(
      appBar: AppBar(
        title: Text("Users"),
        actions: <Widget>[
          new IconButton(
            icon: new Icon(Icons.check),
            onPressed: widget.isNew
                ? () async {
                    if (newUsers.length == 0) {
                      return;
                    }
                    widget.thread.users.addAll(newUsers);
                    widget.thread.userIds.addAll(widget.thread.users.map((user) => user.id).toList());
                    widget.thread.users = widget.thread.users;
                    // Call New Thread
                    var threadId = await Client.addThread(widget.thread);
                    widget.thread.id = threadId;
                    Navigator.pushReplacement(
                      context,
                      MaterialPageRoute(
                        settings: RouteSettings(name: "MessagePage"),
                        builder: (context) => MessagePage(
                          thread: widget.thread,
                        ),
                      ),
                    );
                  }
                : () {
                    if (newUsers.length == 0) {
                      return;
                    }
                    widget.thread.users.addAll(newUsers);
                    widget.thread.userIds.addAll(widget.thread.users.map((user) => user.id).toList());
                    widget.thread.users = widget.thread.users;
                    // Call users patch
                    Client.addUsers(widget.thread);
                    Navigator.pop(context);
                  },
          ),
        ],
      ),

2 ответа

Решение

Если у вас уже есть логика для того, когда включать / отключать кнопку, то вы на 99%.

Если onPressed пропущен ноль, кнопка будет отключена. Таким образом, вы можете просто внести небольшие изменения в создание IconButton:

onPressed: !iconEnabled ? null : (widget.isNew // ... and put the closing parentheses after the onPressed callbacks

Оберните IconButton виджетом AbsorbPointer следующим образом:

AbsorbPointer(
          absorbing: buttonDisabled,
          child: IconButton(
          icon: Icon(Icons.check),
          onPressed: () { disableButton();}
        ),
      ),

Для этого примера я объявил глобальную переменную:

 bool buttonDisabled = false;

Когда кнопка нажата:

 void disableButton() {
    setState(() {
     buttonDisabled = true; 
    });
  }
Другие вопросы по тегам