使用浮动操作按钮更改图标颜色

Changes icon color by using Floating Action Button

我想使用浮动操作按钮更改图标颜色。如果我按红色按钮,图标会变成红色。

代码:

floatingActionButton: Row(
      mainAxisAlignment: MainAxisAlignment.end,
      children: <Widget>[
        FloatingActionButton.extended(
          icon: Icon(Icons.colorize),
          label: Text('Red'),
          backgroundColor: Colors.red,
        ),

因此,您首先要确定的是您当前的小部件是 StatefulWidget,如果您不知道那是什么或如何知道您的小部件是否是有状态小部件,您应该 可能 查看 flutter 初学者教程。

现在,您需要为图标的颜色声明一个变量,并将该颜色传递给图标:

Color iconColor = Colors.blue;
...
Icon(Icons.alarm, color: iconColor),
...

接下来,在您的浮动操作按钮的按下方法上:

onPressed; () => setState(() => iconColor = Colors.red)), // whatever color you want here

setState 部分很重要,因为它告诉 flutter 使用新值重建小部件。

您可以这样做(使用 StatefulWidget 小部件和 setState):

class ChangeIconColor extends StatefulWidget {
  @override
  ChangeIconColorState createState() => ChangeIconColorState();
}

class ChangeIconColorState extends State<ChangeIconColor> {
  
  Color selectedColor = Colors.blue;
  
  changeColor(Color color){
    setState(() {
      selectedColor = color;
    });
  }
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: Row(mainAxisAlignment: MainAxisAlignment.end, children: <Widget>[
        FloatingActionButton.extended(
          onPressed: () {
            changeColor(Colors.red);
          },
          icon: Icon(Icons.colorize),
          label: Text('Red'),
          backgroundColor: Colors.red,
        ),
      ]),
      body: Container(
          child: Icon(
        Icons.lock_clock,
        color: selectedColor,
      )),
    );
  }
}

如果你想使用 StatelessWidget,你可以像这样使用 ValueNotifier:

class ChangeIconColorState extends StatelessWidget {
  final ValueNotifier<Color> selectedColorNotifier = ValueNotifier(Colors.blue);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: Row(mainAxisAlignment: MainAxisAlignment.end, children: <Widget>[
        FloatingActionButton.extended(
          onPressed: () {
            selectedColorNotifier.value = Colors.red;
          },
          icon: Icon(Icons.colorize),
          label: Text('Red'),
          backgroundColor: Colors.red,
        ),
      ]),
      body: Container(
          child: ValueListenableBuilder(
        builder: (context, Color color, child) {
          return Icon(
            Icons.lock_clock,
            color: color,
          );
        },
        valueListenable: selectedColorNotifier,
      )),
    );
  }
}