成果演示


页面

class _TagsState extends State<Tags> {  final int _tagsNum = 8;  late List<bool> _selections; // 选中状态 List  @override  void initState() {    super.initState();    // 初始化选中状态 List    _selections = List.generate(_tagsNum, (_) => false);    // 默认第一个 Tag 是选中状态    _selections[0] = true;  }  @override  Widget build(BuildContext context) {    return Wrap(      children: <Widget>[        ...List.generate(          _tagsNum,          (index) => SelectableButton(            style: TextButton.styleFrom(            // null 即 default 色彩              foregroundColor: _selections[index] ? Colors.amberAccent : null,              backgroundColor: _selections[index] ? Colors.blueAccent : null,            ),            onPressed: () {              setState(() {                // 简略粗犷把所有元素设为 false                for (int i = 0; i < _selections.length; i++) {                  _selections[i] = false;                }                // 再把本身设 true                _selections[index] = !_selections[index];              });            },            child: Text("Tag ${index + 1}"),          ),        ),      ],    );  }}

SelectableButton

class SelectableButton extends StatefulWidget {  const SelectableButton({    super.key,    required this.style,    required this.onPressed,    required this.child,  });  final ButtonStyle? style;  final Function()? onPressed;  final Widget child;  @override  State<SelectableButton> createState() => _SelectableButtonState();}class _SelectableButtonState extends State<SelectableButton> {  @override  Widget build(BuildContext context) {    return TextButton(      style: widget.style,      onPressed: widget.onPressed,      child: widget.child,    );  }}