| // 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'; |
| |
| /// Flutter code sample for [TextButton]. |
| |
| 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<SelectableButton> createState() => _SelectableButtonState(); |
| } |
| |
| class _SelectableButtonState extends State<SelectableButton> { |
| late final WidgetStatesController statesController; |
| |
| @override |
| void initState() { |
| super.initState(); |
| statesController = WidgetStatesController(<WidgetState>{ |
| if (widget.selected) WidgetState.selected, |
| }); |
| } |
| |
| @override |
| void didUpdateWidget(SelectableButton oldWidget) { |
| super.didUpdateWidget(oldWidget); |
| if (widget.selected != oldWidget.selected) { |
| statesController.update(WidgetState.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<Home> createState() => _HomeState(); |
| } |
| |
| class _HomeState extends State<Home> { |
| bool selected = false; |
| |
| /// Sets the button's foreground and background colors. |
| /// If not selected, resolves to null and defers to default values. |
| static const ButtonStyle style = ButtonStyle( |
| foregroundColor: WidgetStateProperty<Color?>.fromMap(<WidgetState, Color>{ |
| WidgetState.selected: Colors.white, |
| }), |
| backgroundColor: WidgetStateProperty<Color?>.fromMap(<WidgetState, Color>{ |
| WidgetState.selected: Colors.indigo, |
| }), |
| ); |
| |
| @override |
| Widget build(BuildContext context) { |
| return Scaffold( |
| body: Center( |
| child: SelectableButton( |
| selected: selected, |
| style: style, |
| onPressed: () { |
| setState(() { |
| selected = !selected; |
| }); |
| }, |
| child: const Text('toggle selected'), |
| ), |
| ), |
| ); |
| } |
| } |