| // 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. |
| |
| /// Flutter code sample for [TextButton]. |
| |
| 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<SelectableButton> createState() => _SelectableButtonState(); |
| |
| } |
| |
| class _SelectableButtonState extends State<SelectableButton> { |
| late final MaterialStatesController statesController; |
| |
| @override |
| void initState() { |
| super.initState(); |
| statesController = MaterialStatesController(<MaterialState>{ |
| 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<Home> createState() => _HomeState(); |
| } |
| |
| class _HomeState extends State<Home> { |
| bool selected = false; |
| |
| @override |
| Widget build(BuildContext context) { |
| return Scaffold( |
| body: Center( |
| child: SelectableButton( |
| selected: selected, |
| style: ButtonStyle( |
| foregroundColor: MaterialStateProperty.resolveWith<Color?>( |
| (Set<MaterialState> states) { |
| if (states.contains(MaterialState.selected)) { |
| return Colors.white; |
| } |
| return null; // defer to the defaults |
| }, |
| ), |
| backgroundColor: MaterialStateProperty.resolveWith<Color?>( |
| (Set<MaterialState> states) { |
| if (states.contains(MaterialState.selected)) { |
| return Colors.indigo; |
| } |
| return null; // defer to the defaults |
| }, |
| ), |
| ), |
| onPressed: () { |
| setState(() { selected = !selected; }); |
| }, |
| child: const Text('toggle selected'), |
| ), |
| ), |
| ); |
| } |
| } |