如何在Flutter中的多个按钮中更改一个按钮的颜色?

问题描述 投票:0回答:1

我是Dart和Flutter框架的新手。当前,我有一个由25个按钮填充的GridView。默认情况下,每个按钮都有橙色背景色。但是,我想为用户提供一个选项,使其可以长按任意一个按钮,然后会弹出一个PopUpMenu,让他们可以选择在为按钮选择其他颜色之间进行选择。这是我尝试过的两件事:

  1. 设置更改颜色的全局变量。但是,当我更改其状态时,它将更改所有按钮的颜色(我只希望更改所选按钮的颜色)。
  2. 通过按钮的实例传递局部变量,并将该变量传递给PopUpMenu。但是,这不会更改按钮的任何内容。

我该如何解决这个问题?我将在下面提供一些代码片段以帮助您。请注意,此代码指的是#2的实现方式。

25按钮实例化

    // Random number generator
    var _randGen = new Random();

    //List of maze cards
    List<Widget> mazeCards = new List();

    // Generate cards until it has 25 cards within the list
    while(mazeCards.length != 25)
    {

      // Get the index
      var _currIndex = _randGen.nextInt(words.length);
      // Add the card to the list
      var _cardColor = Colors.orange;
      mazeCards.add(createCard(words[_currIndex], _cardColor));

    }

createCard方法:

  Widget createCard(String someString, Color _cardColor)
  {
    return GestureDetector(
          onTapDown: _storePosition,
          child: Container(
            padding: EdgeInsets.all(8.0),
            child:
              _createButton(someString, _cardColor)
          ),
    );
  }

createButton方法:

  Widget _createButton(String someString, Color _cardColor)
  {

    Widget newButton = MaterialButton(
                padding: EdgeInsets.all(50.0),
                color: _cardColor,
                onPressed: () => _printButtonText(someString),
                onLongPress: () {
                  cardOptionsMenu(_cardColor);
                },
                textTheme: ButtonTextTheme.primary,
                 //_someColor(),
                child: Text(someString)
    );

    return newButton; 
  }

cardOptionsMenu方法:

void cardOptionsMenu(Color _cardColor)
  {

    final RenderBox overlay = Overlay.of(context).context.findRenderObject(); 
    showMenu(
      context: context,
      ...
    )
    .then<void>((CardOptionEnum cardOption) {
      if (cardOption == null) return;
      else{
        switch (cardOption)
          {
            case CardOptionEnum.makeBlackCard:
              setState(() {
                _cardColor = Colors.black;
              });
              break;
            case CardOptionEnum.makeBlueCard:
              setState(() {
                _cardColor = Colors.blue;
              });
              break;
            case CardOptionEnum.makeRedCard:
              setState(() {
                _cardColor = Colors.red;
              });
              break;
            case CardOptionEnum.makeYellowCard:
              setState(() {
                _cardColor = Colors.yellow;

              });
              break;
            case CardOptionEnum.changeWord:

              break;
          }
      }
    });
  }
flutter dart frontend flutter-layout flutter-web
1个回答
0
投票

Pic

© www.soinside.com 2019 - 2024. All rights reserved.