| // 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() { |
| // Changes made in https://github.com/flutter/flutter/pull/142151 |
| WidgetState selected = WidgetState.selected; |
| WidgetState hovered = WidgetState.hovered; |
| WidgetState focused = WidgetState.focused; |
| WidgetState pressed = WidgetState.pressed; |
| WidgetState dragged = WidgetState.dragged; |
| WidgetState scrolledUnder = WidgetState.scrolledUnder; |
| WidgetState disabled = WidgetState.disabled; |
| WidgetState error = WidgetState.error; |
| |
| final WidgetPropertyResolver<MouseCursor?> resolveCallback; |
| |
| Color getColor(Set<WidgetState> states) { |
| if (states.contains(WidgetState.disabled)) { |
| if (states.contains(WidgetState.selected)) { |
| return Color(0xFF000002); |
| } |
| return Color(0xFF000004); |
| } |
| if (states.contains(WidgetState.selected)) { |
| return Color(0xFF000001); |
| } |
| return Color(0xFF000003); |
| } |
| |
| final WidgetStateProperty<Color> backgroundColor = WidgetStateColor.resolveWith(getColor); |
| |
| class _MouseCursor extends WidgetStateMouseCursor { |
| const _MouseCursor(this.resolveCallback); |
| |
| final WidgetPropertyResolver<MouseCursor?> resolveCallback; |
| |
| @override |
| MouseCursor resolve(Set<WidgetState> states) => resolveCallback(states) ?? MouseCursor.uncontrolled; |
| } |
| |
| WidgetStateBorderSide? get side { |
| return WidgetStateBorderSide.resolveWith((Set<WidgetState> states) { |
| if (states.contains(WidgetState.disabled)) { |
| if (states.contains(WidgetState.selected)) { |
| return const BorderSide(width: 2.0); |
| } |
| return BorderSide(width: 1.0); |
| } |
| if (states.contains(WidgetState.selected)) { |
| return const BorderSide(width: 1.5); |
| } |
| return BorderSide(width: 0.5); |
| }); |
| } |
| |
| class SelectedBorder extends RoundedRectangleBorder implements WidgetStateOutlinedBorder { |
| const SelectedBorder(); |
| |
| @override |
| OutlinedBorder? resolve(Set<WidgetState> states) { |
| if (states.contains(WidgetState.selected)) { |
| return const RoundedRectangleBorder(); |
| } |
| return null; |
| } |
| } |
| |
| TextStyle floatingLabelStyle = WidgetStateTextStyle.resolveWith( |
| (Set<WidgetState> states) { |
| final Color color = |
| states.contains(WidgetState.error) ? Theme.of(context).colorScheme.error : Colors.orange; |
| return TextStyle(color: color, letterSpacing: 1.3); |
| }, |
| ); |
| |
| final WidgetStateProperty<Icon?> thumbIcon = |
| WidgetStateProperty.resolveWith<Icon?>((Set<WidgetState> states) { |
| if (states.contains(WidgetState.selected)) { |
| return const Icon(Icons.check); |
| } |
| return const Icon(Icons.close); |
| }); |
| |
| final Color backgroundColor = WidgetStatePropertyAll<Color>( |
| Colors.blue.withOpacity(0.12), |
| ); |
| |
| final WidgetStatesController statesController = |
| WidgetStatesController(<WidgetState>{if (widget.selected) WidgetState.selected}); |
| |
| class _MyWidget extends StatefulWidget { |
| const _MyWidget({ |
| required this.controller, |
| required this.evaluator, |
| required this.materialState, |
| }); |
| |
| final bool Function(_MyWidgetState state) evaluator; |
| |
| /// Stream passed down to the child [_InnerWidget] to begin the process. |
| /// This plays the role of an actual user interaction in the wild, but allows |
| /// us to engage the system without mocking pointers/hovers etc. |
| final StreamController<bool> controller; |
| |
| /// The value we're watching in the given test. |
| final WidgetState materialState; |
| |
| @override |
| State createState() => _MyWidgetState(); |
| } |
| |
| } |