// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/material.dart'; void main() { runApp(const MaterialApp(home: Home())); } class SelectableButton extends StatefulWidget { const SelectableButton({ super.key, required this.selected, this.style, required this.onPressed, required this.child, }); final bool selected; final ButtonStyle? style; final VoidCallback? onPressed; final Widget child; @override State createState() => _SelectableButtonState(); } class _SelectableButtonState extends State { late final MaterialStatesController statesController; @override void initState() { super.initState(); statesController = MaterialStatesController({ if (widget.selected) MaterialState.selected }); } @override void didUpdateWidget(SelectableButton oldWidget) { super.didUpdateWidget(oldWidget); if (widget.selected != oldWidget.selected) { statesController.update(MaterialState.selected, widget.selected); } } @override Widget build(BuildContext context) { return TextButton( statesController: statesController, style: widget.style, onPressed: widget.onPressed, child: widget.child, ); } } class Home extends StatefulWidget { const Home({ super.key }); @override State createState() => _HomeState(); } class _HomeState extends State { bool selected = false; @override Widget build(BuildContext context) { return Scaffold( body: Center( child: SelectableButton( selected: selected, style: ButtonStyle( foregroundColor: MaterialStateProperty.resolveWith( (Set states) { if (states.contains(MaterialState.selected)) { return Colors.white; } return null; // defer to the defaults }, ), backgroundColor: MaterialStateProperty.resolveWith( (Set states) { if (states.contains(MaterialState.selected)) { return Colors.indigo; } return null; // defer to the defaults }, ), ), onPressed: () { setState(() { selected = !selected; }); }, child: const Text('toggle selected'), ), ), ); } }