Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/flutter/lib/src/material/button_style_button.dart
Original file line number Diff line number Diff line change
Expand Up @@ -618,7 +618,7 @@ class _ButtonStyleState extends State<ButtonStyleButton> with TickerProviderStat
class _MouseCursor extends MaterialStateMouseCursor {
const _MouseCursor(this.resolveCallback);

final MaterialPropertyResolver<MouseCursor?> resolveCallback;
final WidgetPropertyResolver<MouseCursor?> resolveCallback;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

While this change is correct, the resolve method in the _MouseCursor class (line 624) uses a null-check operator (!). This could lead to a runtime error if a custom button implementation doesn't provide a mouseCursor style, causing resolveCallback to return null.

For improved robustness and consistency with _MouseCursor in menu_anchor.dart, it would be safer to provide a fallback value.

Consider changing line 624 from:

MouseCursor resolve(Set<WidgetState> states) => resolveCallback(states)!;

To:

MouseCursor resolve(Set<WidgetState> states) => resolveCallback(states) ?? MouseCursor.uncontrolled;


@override
MouseCursor resolve(Set<WidgetState> states) => resolveCallback(states)!;
Expand Down
2 changes: 1 addition & 1 deletion packages/flutter/lib/src/material/menu_anchor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3436,7 +3436,7 @@ class _Submenu extends StatelessWidget {
class _MouseCursor extends MaterialStateMouseCursor {
const _MouseCursor(this.resolveCallback);

final MaterialPropertyResolver<MouseCursor?> resolveCallback;
final WidgetPropertyResolver<MouseCursor?> resolveCallback;

@override
MouseCursor resolve(Set<WidgetState> states) =>
Expand Down
4 changes: 2 additions & 2 deletions packages/flutter/test/material/chip_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6407,7 +6407,7 @@ void main() {
class _MaterialStateOutlinedBorder extends StadiumBorder implements MaterialStateOutlinedBorder {
const _MaterialStateOutlinedBorder(this.resolver);

final MaterialPropertyResolver<OutlinedBorder?> resolver;
final WidgetPropertyResolver<OutlinedBorder?> resolver;

@override
OutlinedBorder? resolve(Set<WidgetState> states) => resolver(states);
Expand All @@ -6416,7 +6416,7 @@ class _MaterialStateOutlinedBorder extends StadiumBorder implements MaterialStat
class _MaterialStateBorderSide extends MaterialStateBorderSide {
const _MaterialStateBorderSide(this.resolver);

final MaterialPropertyResolver<BorderSide?> resolver;
final WidgetPropertyResolver<BorderSide?> resolver;

@override
BorderSide? resolve(Set<WidgetState> states) => resolver(states);
Expand Down
4 changes: 2 additions & 2 deletions packages/flutter/test/material/chip_theme_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1529,7 +1529,7 @@ void main() {
class _MaterialStateOutlinedBorder extends StadiumBorder implements MaterialStateOutlinedBorder {
const _MaterialStateOutlinedBorder(this.resolver);

final MaterialPropertyResolver<OutlinedBorder?> resolver;
final WidgetPropertyResolver<OutlinedBorder?> resolver;

@override
OutlinedBorder? resolve(Set<WidgetState> states) => resolver(states);
Expand All @@ -1538,7 +1538,7 @@ class _MaterialStateOutlinedBorder extends StadiumBorder implements MaterialStat
class _MaterialStateBorderSide extends MaterialStateBorderSide {
const _MaterialStateBorderSide(this.resolver);

final MaterialPropertyResolver<BorderSide?> resolver;
final WidgetPropertyResolver<BorderSide?> resolver;

@override
BorderSide? resolve(Set<WidgetState> states) => resolver(states);
Expand Down