From 22057a8040f13bfa65bcb726739c77602b4a6dbf Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 1 Jul 2026 15:03:16 -0700 Subject: [PATCH 1/3] Impl --- .../material_state_outlined_border.0.dart | 60 ++++ .../text_field/text_field_magnifier.0.dart | 107 ++++++++ .../text_field/text_field_tap_region.0.dart | 258 ++++++++++++++++++ ...material_state_outlined_border.0_test.dart | 60 ++++ .../text_field_magnifier.0_test.dart | 120 ++++++++ .../text_field_tap_region.0_test.dart | 99 +++++++ 6 files changed, 704 insertions(+) create mode 100644 packages/material_ui/example/lib/material_state/material_state_outlined_border.0.dart create mode 100644 packages/material_ui/example/lib/text_field/text_field_magnifier.0.dart create mode 100644 packages/material_ui/example/lib/text_field/text_field_tap_region.0.dart create mode 100644 packages/material_ui/example/test/material_state/material_state_outlined_border.0_test.dart create mode 100644 packages/material_ui/example/test/text_field/text_field_magnifier.0_test.dart create mode 100644 packages/material_ui/example/test/text_field/text_field_tap_region.0_test.dart diff --git a/packages/material_ui/example/lib/material_state/material_state_outlined_border.0.dart b/packages/material_ui/example/lib/material_state/material_state_outlined_border.0.dart new file mode 100644 index 000000000000..a596bd9b936c --- /dev/null +++ b/packages/material_ui/example/lib/material_state/material_state_outlined_border.0.dart @@ -0,0 +1,60 @@ +// 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:material_ui/material_ui.dart'; + +/// Flutter code sample for [WidgetStateOutlinedBorder]. + +void main() => runApp(const WidgetStateOutlinedBorderExampleApp()); + +class WidgetStateOutlinedBorderExampleApp extends StatelessWidget { + const WidgetStateOutlinedBorderExampleApp({super.key}); + + @override + Widget build(BuildContext context) { + return const MaterialApp(home: WidgetStateOutlinedBorderExample()); + } +} + +class SelectedBorder extends RoundedRectangleBorder + implements WidgetStateOutlinedBorder { + const SelectedBorder(); + + @override + OutlinedBorder? resolve(Set states) { + if (states.contains(WidgetState.selected)) { + return const RoundedRectangleBorder(); + } + return null; // Defer to default value on the theme or widget. + } +} + +class WidgetStateOutlinedBorderExample extends StatefulWidget { + const WidgetStateOutlinedBorderExample({super.key}); + + @override + State createState() => + _WidgetStateOutlinedBorderExampleState(); +} + +class _WidgetStateOutlinedBorderExampleState + extends State { + bool isSelected = true; + + @override + Widget build(BuildContext context) { + return Material( + child: FilterChip( + label: const Text('Select chip'), + selected: isSelected, + onSelected: (bool value) { + setState(() { + isSelected = value; + }); + }, + shape: const SelectedBorder(), + ), + ); + } +} diff --git a/packages/material_ui/example/lib/text_field/text_field_magnifier.0.dart b/packages/material_ui/example/lib/text_field/text_field_magnifier.0.dart new file mode 100644 index 000000000000..44f06d02b6da --- /dev/null +++ b/packages/material_ui/example/lib/text_field/text_field_magnifier.0.dart @@ -0,0 +1,107 @@ +// 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/foundation.dart'; +import 'package:material_ui/material_ui.dart'; + +void main() => runApp(const TextMagnifierExampleApp(text: 'Hello world!')); + +class TextMagnifierExampleApp extends StatelessWidget { + const TextMagnifierExampleApp({ + super.key, + this.textDirection = TextDirection.ltr, + required this.text, + }); + + final TextDirection textDirection; + final String text; + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + body: Padding( + padding: const .symmetric(horizontal: 48.0), + child: Center( + child: TextField( + textDirection: textDirection, + // Create a custom magnifier configuration that + // this `TextField` will use to build a magnifier with. + magnifierConfiguration: TextMagnifierConfiguration( + magnifierBuilder: + (_, _, ValueNotifier magnifierInfo) => + CustomMagnifier(magnifierInfo: magnifierInfo), + ), + controller: TextEditingController(text: text), + ), + ), + ), + ), + ); + } +} + +class CustomMagnifier extends StatelessWidget { + const CustomMagnifier({super.key, required this.magnifierInfo}); + + static const Size magnifierSize = Size(200, 200); + + // This magnifier will consume some text data and position itself + // based on the info in the magnifier. + final ValueNotifier magnifierInfo; + + @override + Widget build(BuildContext context) { + // Use a value listenable builder because we want to rebuild + // every time the text selection info changes. + // `CustomMagnifier` could also be a `StatefulWidget` and call `setState` + // when `magnifierInfo` updates. This would be useful for more complex + // positioning cases. + return ValueListenableBuilder( + valueListenable: magnifierInfo, + builder: (BuildContext context, MagnifierInfo currentMagnifierInfo, _) { + // We want to position the magnifier at the global position of the gesture. + Offset magnifierPosition = currentMagnifierInfo.globalGesturePosition; + + // You may use the `MagnifierInfo` however you'd like: + // In this case, we make sure the magnifier never goes out of the current line bounds. + magnifierPosition = Offset( + clampDouble( + magnifierPosition.dx, + currentMagnifierInfo.currentLineBoundaries.left, + currentMagnifierInfo.currentLineBoundaries.right, + ), + clampDouble( + magnifierPosition.dy, + currentMagnifierInfo.currentLineBoundaries.top, + currentMagnifierInfo.currentLineBoundaries.bottom, + ), + ); + + // Finally, align the magnifier to the bottom center. The initial anchor is + // the top left, so subtract bottom center alignment. + magnifierPosition -= Alignment.bottomCenter.alongSize(magnifierSize); + + return Positioned( + left: magnifierPosition.dx, + top: magnifierPosition.dy, + child: RawMagnifier( + magnificationScale: 2, + // The focal point starts at the center of the magnifier. + // We probably want to point below the magnifier, so + // offset the focal point by half the magnifier height. + focalPointOffset: Offset(0, magnifierSize.height / 2), + // Decorate it however we'd like! + decoration: const MagnifierDecoration( + shape: StarBorder( + side: BorderSide(color: Colors.green, width: 2), + ), + ), + size: magnifierSize, + ), + ); + }, + ); + } +} diff --git a/packages/material_ui/example/lib/text_field/text_field_tap_region.0.dart b/packages/material_ui/example/lib/text_field/text_field_tap_region.0.dart new file mode 100644 index 000000000000..9969cd9ce7c8 --- /dev/null +++ b/packages/material_ui/example/lib/text_field/text_field_tap_region.0.dart @@ -0,0 +1,258 @@ +// 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/services.dart'; +import 'package:material_ui/material_ui.dart'; + +/// Flutter code sample for [TextFieldTapRegion]. + +void main() => runApp(const TapRegionApp()); + +class TapRegionApp extends StatelessWidget { + const TapRegionApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar(title: const Text('TextFieldTapRegion Example')), + body: const TextFieldTapRegionExample(), + ), + ); + } +} + +class TextFieldTapRegionExample extends StatefulWidget { + const TextFieldTapRegionExample({super.key}); + + @override + State createState() => + _TextFieldTapRegionExampleState(); +} + +class _TextFieldTapRegionExampleState extends State { + int value = 0; + + @override + Widget build(BuildContext context) { + return ListView( + children: [ + Center( + child: Padding( + padding: const .all(20.0), + child: SizedBox( + width: 150, + height: 80, + child: IntegerSpinnerField( + value: value, + autofocus: true, + onChanged: (int newValue) { + if (value == newValue) { + // Avoid unnecessary redraws. + return; + } + setState(() { + // Update the value and redraw. + value = newValue; + }); + }, + ), + ), + ), + ), + ], + ); + } +} + +/// An integer example of the generic [SpinnerField] that validates input and +/// increments by a delta. +class IntegerSpinnerField extends StatelessWidget { + const IntegerSpinnerField({ + super.key, + required this.value, + this.autofocus = false, + this.delta = 1, + this.onChanged, + }); + + final int value; + final bool autofocus; + final int delta; + final ValueChanged? onChanged; + + @override + Widget build(BuildContext context) { + return SpinnerField( + value: value, + onChanged: onChanged, + autofocus: autofocus, + fromString: (String stringValue) => int.tryParse(stringValue) ?? value, + increment: (int i) => i + delta, + decrement: (int i) => i - delta, + // Add a text formatter that only allows integer values and a leading + // minus sign. + inputFormatters: [ + TextInputFormatter.withFunction(( + TextEditingValue oldValue, + TextEditingValue newValue, + ) { + String newString; + if (newValue.text.startsWith('-')) { + newString = '-${newValue.text.replaceAll(RegExp(r'\D'), '')}'; + } else { + newString = newValue.text.replaceAll(RegExp(r'\D'), ''); + } + return newValue.copyWith( + text: newString, + selection: newValue.selection.copyWith( + baseOffset: newValue.selection.baseOffset.clamp( + 0, + newString.length, + ), + extentOffset: newValue.selection.extentOffset.clamp( + 0, + newString.length, + ), + ), + ); + }), + ], + ); + } +} + +/// A generic "spinner" field example which adds extra buttons next to a +/// [TextField] to increment and decrement the value. +/// +/// This widget uses [TextFieldTapRegion] to indicate that tapping on the +/// spinner buttons should not cause the text field to lose focus. +class SpinnerField extends StatefulWidget { + SpinnerField({ + super.key, + required this.value, + required this.fromString, + this.autofocus = false, + String Function(T value)? asString, + this.increment, + this.decrement, + this.onChanged, + this.inputFormatters = const [], + }) : asString = asString ?? ((T value) => value.toString()); + + final T value; + final T Function(T value)? increment; + final T Function(T value)? decrement; + final String Function(T value) asString; + final T Function(String value) fromString; + final ValueChanged? onChanged; + final List inputFormatters; + final bool autofocus; + + @override + State> createState() => _SpinnerFieldState(); +} + +class _SpinnerFieldState extends State> { + TextEditingController controller = TextEditingController(); + + @override + void initState() { + super.initState(); + _updateText(widget.asString(widget.value)); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + + @override + void didUpdateWidget(covariant SpinnerField oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.asString != widget.asString || + oldWidget.value != widget.value) { + final String newText = widget.asString(widget.value); + _updateText(newText); + } + } + + void _updateText(String text, {bool collapsed = true}) { + if (text != controller.text) { + controller.value = TextEditingValue( + text: text, + selection: collapsed + ? TextSelection.collapsed(offset: text.length) + : TextSelection(baseOffset: 0, extentOffset: text.length), + ); + } + } + + void _spin(T Function(T value)? spinFunction) { + if (spinFunction == null) { + return; + } + final T newValue = spinFunction(widget.value); + widget.onChanged?.call(newValue); + _updateText(widget.asString(newValue), collapsed: false); + } + + void _increment() { + _spin(widget.increment); + } + + void _decrement() { + _spin(widget.decrement); + } + + @override + Widget build(BuildContext context) { + return CallbackShortcuts( + bindings: { + const SingleActivator(LogicalKeyboardKey.arrowUp): _increment, + const SingleActivator(LogicalKeyboardKey.arrowDown): _decrement, + }, + child: Row( + children: [ + Expanded( + child: TextField( + autofocus: widget.autofocus, + inputFormatters: widget.inputFormatters, + decoration: const InputDecoration(border: OutlineInputBorder()), + onChanged: (String value) => + widget.onChanged?.call(widget.fromString(value)), + controller: controller, + textAlign: .center, + ), + ), + const SizedBox(width: 12), + // Without this TextFieldTapRegion, tapping on the buttons below would + // increment the value, but it would cause the text field to be + // unfocused, since tapping outside of a text field should unfocus it + // on non-mobile platforms. + TextFieldTapRegion( + child: Column( + mainAxisAlignment: .center, + children: [ + Expanded( + child: OutlinedButton( + onPressed: _increment, + child: const Icon(Icons.add), + ), + ), + Expanded( + child: OutlinedButton( + onPressed: _decrement, + child: const Icon(Icons.remove), + ), + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/packages/material_ui/example/test/material_state/material_state_outlined_border.0_test.dart b/packages/material_ui/example/test/material_state/material_state_outlined_border.0_test.dart new file mode 100644 index 000000000000..1053d8437981 --- /dev/null +++ b/packages/material_ui/example/test/material_state/material_state_outlined_border.0_test.dart @@ -0,0 +1,60 @@ +// 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_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; +import 'package:material_ui_examples/material_state/material_state_outlined_border.0.dart' + as example; + +void main() { + Finder findBorderShape(OutlinedBorder? shape) { + return find.descendant( + of: find.byType(FilterChip), + matching: find.byWidgetPredicate((Widget widget) { + if (widget is! Material) { + return false; + } + return widget.shape == shape; + }), + ); + } + + testWidgets('FilterChip displays the correct border when selected', ( + WidgetTester tester, + ) async { + await tester.pumpWidget( + const example.WidgetStateOutlinedBorderExampleApp(), + ); + + expect( + findBorderShape( + const RoundedRectangleBorder( + side: BorderSide(color: Colors.transparent), + ), + ), + findsOne, + ); + }); + + testWidgets('FilterChip displays the correct border when not selected', ( + WidgetTester tester, + ) async { + await tester.pumpWidget( + const example.WidgetStateOutlinedBorderExampleApp(), + ); + + await tester.tap(find.byType(FilterChip)); + await tester.pumpAndSettle(); + + expect( + findBorderShape( + RoundedRectangleBorder( + side: const BorderSide(color: Color(0xFFCAC4D0)), + borderRadius: .circular(8), + ), + ), + findsOne, + ); + }); +} diff --git a/packages/material_ui/example/test/text_field/text_field_magnifier.0_test.dart b/packages/material_ui/example/test/text_field/text_field_magnifier.0_test.dart new file mode 100644 index 000000000000..32b413d2e889 --- /dev/null +++ b/packages/material_ui/example/test/text_field/text_field_magnifier.0_test.dart @@ -0,0 +1,120 @@ +// 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_test/flutter_test.dart'; +import 'package:flutter/rendering.dart'; +import 'package:material_ui/material_ui.dart'; +import 'package:material_ui_examples/text_field/text_field_magnifier.0.dart' + as example; + +List _globalize( + Iterable points, + RenderBox box, +) { + return points.map((TextSelectionPoint point) { + return TextSelectionPoint(box.localToGlobal(point.point), point.direction); + }).toList(); +} + +RenderEditable _findRenderEditable>( + WidgetTester tester, +) { + return (tester.state(find.byType(TextField)) + as TextSelectionGestureDetectorBuilderDelegate) + .editableTextKey + .currentState! + .renderEditable; +} + +Offset _textOffsetToPosition>( + WidgetTester tester, + int offset, +) { + final RenderEditable renderEditable = _findRenderEditable(tester); + + final List endpoints = renderEditable + .getEndpointsForSelection(TextSelection.collapsed(offset: offset)) + .map( + (TextSelectionPoint point) => TextSelectionPoint( + renderEditable.localToGlobal(point.point), + point.direction, + ), + ) + .toList(); + + return endpoints[0].point + const Offset(0.0, -2.0); +} + +void main() { + const Duration durationBetweenActions = Duration(milliseconds: 20); + const String defaultText = 'I am a magnifier, fear me!'; + + Future showMagnifier(WidgetTester tester, int textOffset) async { + assert(textOffset >= 0); + final Offset tapOffset = _textOffsetToPosition(tester, textOffset); + + // Double tap 'Magnifier' word to show the selection handles. + final TestGesture testGesture = await tester.startGesture(tapOffset); + await tester.pump(durationBetweenActions); + await testGesture.up(); + await tester.pump(durationBetweenActions); + await testGesture.down(tapOffset); + await tester.pump(durationBetweenActions); + await testGesture.up(); + await tester.pumpAndSettle(); + + final TextEditingController controller = tester + .firstWidget(find.byType(TextField)) + .controller!; + + final TextSelection selection = controller.selection; + final RenderEditable renderEditable = _findRenderEditable(tester); + final List endpoints = _globalize( + renderEditable.getEndpointsForSelection(selection), + renderEditable, + ); + + final Offset handlePos = endpoints.last.point + const Offset(10.0, 10.0); + + final TestGesture gesture = await tester.startGesture(handlePos); + + await gesture.moveTo(_textOffsetToPosition(tester, defaultText.length - 2)); + await tester.pump(); + } + + testWidgets( + 'should show custom magnifier on drag', + (WidgetTester tester) async { + await tester.pumpWidget( + const example.TextMagnifierExampleApp(text: defaultText), + ); + + await showMagnifier(tester, defaultText.indexOf('e')); + expect(find.byType(example.CustomMagnifier), findsOneWidget); + + await expectLater( + find.byType(example.TextMagnifierExampleApp), + matchesGoldenFile('text_magnifier.0_test.png'), + ); + }, + variant: const TargetPlatformVariant({.iOS, .android}), + // This image is flaky. https://github.com/flutter/flutter/issues/144350 + skip: true, + ); + + testWidgets('should show custom magnifier in RTL', ( + WidgetTester tester, + ) async { + const String text = 'أثارت زر'; + const String textToTapOn = 'ت'; + + await tester.pumpWidget( + const example.TextMagnifierExampleApp(textDirection: .rtl, text: text), + ); + + await showMagnifier(tester, text.indexOf(textToTapOn)); + + expect(find.byType(example.CustomMagnifier), findsOneWidget); + }); +} diff --git a/packages/material_ui/example/test/text_field/text_field_tap_region.0_test.dart b/packages/material_ui/example/test/text_field/text_field_tap_region.0_test.dart new file mode 100644 index 000000000000..81c57c11886b --- /dev/null +++ b/packages/material_ui/example/test/text_field/text_field_tap_region.0_test.dart @@ -0,0 +1,99 @@ +// 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_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; +import 'package:material_ui_examples/text_field/text_field_tap_region.0.dart' + as example; + +void main() { + testWidgets('shows a text field with a zero count, and the spinner buttons', ( + WidgetTester tester, + ) async { + await tester.pumpWidget(const example.TapRegionApp()); + + expect(find.byType(TextField), findsOneWidget); + expect(getFieldValue(tester).text, equals('0')); + expect(find.byIcon(Icons.add), findsOneWidget); + expect(find.byIcon(Icons.remove), findsOneWidget); + }); + + testWidgets('tapping increment/decrement works', (WidgetTester tester) async { + await tester.pumpWidget(const example.TapRegionApp()); + await tester.pump(); + + expect(getFieldValue(tester).text, equals('0')); + expect( + getFieldValue(tester).selection, + equals(const TextSelection.collapsed(offset: 1)), + ); + + await tester.tap(find.byIcon(Icons.add)); + await tester.pumpAndSettle(); + + expect(getFieldValue(tester).text, equals('1')); + expect( + getFieldValue(tester).selection, + equals(const TextSelection(baseOffset: 0, extentOffset: 1)), + ); + + await tester.tap(find.byIcon(Icons.remove)); + await tester.pumpAndSettle(); + await tester.tap(find.byIcon(Icons.remove)); + await tester.pumpAndSettle(); + + expect(getFieldValue(tester).text, equals('-1')); + expect( + getFieldValue(tester).selection, + equals(const TextSelection(baseOffset: 0, extentOffset: 2)), + ); + }); + + testWidgets('entering text and then incrementing/decrementing works', ( + WidgetTester tester, + ) async { + await tester.pumpWidget(const example.TapRegionApp()); + await tester.pump(); + + await tester.tap(find.byIcon(Icons.add)); + await tester.pumpAndSettle(); + + expect(getFieldValue(tester).text, equals('1')); + expect( + getFieldValue(tester).selection, + equals(const TextSelection(baseOffset: 0, extentOffset: 1)), + ); + + await tester.enterText(find.byType(TextField), '123'); + await tester.pumpAndSettle(); + expect(getFieldValue(tester).text, equals('123')); + expect( + getFieldValue(tester).selection, + equals(const TextSelection.collapsed(offset: 3)), + ); + + await tester.tap(find.byIcon(Icons.remove)); + await tester.pumpAndSettle(); + await tester.tap(find.byIcon(Icons.remove)); + await tester.pumpAndSettle(); + + expect(getFieldValue(tester).text, equals('121')); + expect( + getFieldValue(tester).selection, + equals(const TextSelection(baseOffset: 0, extentOffset: 3)), + ); + final FocusNode textFieldFocusNode = Focus.of( + tester.element( + find.byWidgetPredicate((Widget widget) { + return widget.runtimeType.toString() == '_Editable'; + }), + ), + ); + expect(textFieldFocusNode.hasPrimaryFocus, isTrue); + }); +} + +TextEditingValue getFieldValue(WidgetTester tester) { + return (tester.widget(find.byType(TextField)) as TextField).controller!.value; +} From 7883b6758eddd93a53220a8c52ac9d6c0536fc46 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 1 Jul 2026 16:12:04 -0700 Subject: [PATCH 2/3] Change license header --- .../lib/material_state/material_state_outlined_border.0.dart | 2 +- .../example/lib/text_field/text_field_magnifier.0.dart | 2 +- .../example/lib/text_field/text_field_tap_region.0.dart | 2 +- .../material_state/material_state_outlined_border.0_test.dart | 2 +- .../example/test/text_field/text_field_magnifier.0_test.dart | 2 +- .../example/test/text_field/text_field_tap_region.0_test.dart | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/material_ui/example/lib/material_state/material_state_outlined_border.0.dart b/packages/material_ui/example/lib/material_state/material_state_outlined_border.0.dart index a596bd9b936c..d58c5dc027a6 100644 --- a/packages/material_ui/example/lib/material_state/material_state_outlined_border.0.dart +++ b/packages/material_ui/example/lib/material_state/material_state_outlined_border.0.dart @@ -1,4 +1,4 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/material_ui/example/lib/text_field/text_field_magnifier.0.dart b/packages/material_ui/example/lib/text_field/text_field_magnifier.0.dart index 44f06d02b6da..37183e1eb929 100644 --- a/packages/material_ui/example/lib/text_field/text_field_magnifier.0.dart +++ b/packages/material_ui/example/lib/text_field/text_field_magnifier.0.dart @@ -1,4 +1,4 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/material_ui/example/lib/text_field/text_field_tap_region.0.dart b/packages/material_ui/example/lib/text_field/text_field_tap_region.0.dart index 9969cd9ce7c8..8a485b2ffd52 100644 --- a/packages/material_ui/example/lib/text_field/text_field_tap_region.0.dart +++ b/packages/material_ui/example/lib/text_field/text_field_tap_region.0.dart @@ -1,4 +1,4 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/material_ui/example/test/material_state/material_state_outlined_border.0_test.dart b/packages/material_ui/example/test/material_state/material_state_outlined_border.0_test.dart index 1053d8437981..6d3cdf46b3d1 100644 --- a/packages/material_ui/example/test/material_state/material_state_outlined_border.0_test.dart +++ b/packages/material_ui/example/test/material_state/material_state_outlined_border.0_test.dart @@ -1,4 +1,4 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/material_ui/example/test/text_field/text_field_magnifier.0_test.dart b/packages/material_ui/example/test/text_field/text_field_magnifier.0_test.dart index 32b413d2e889..86382e264f38 100644 --- a/packages/material_ui/example/test/text_field/text_field_magnifier.0_test.dart +++ b/packages/material_ui/example/test/text_field/text_field_magnifier.0_test.dart @@ -1,4 +1,4 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/material_ui/example/test/text_field/text_field_tap_region.0_test.dart b/packages/material_ui/example/test/text_field/text_field_tap_region.0_test.dart index 81c57c11886b..41ba403047c7 100644 --- a/packages/material_ui/example/test/text_field/text_field_tap_region.0_test.dart +++ b/packages/material_ui/example/test/text_field/text_field_tap_region.0_test.dart @@ -1,4 +1,4 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. +// Copyright 2013 The Flutter Authors. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. From a7d56ab620751a5a5f9e97e3060d40880cac8b4f Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 1 Jul 2026 16:27:39 -0700 Subject: [PATCH 3/3] Dots --- .../lib/material_state/material_state_outlined_border.0.dart | 2 +- .../example/lib/text_field/text_field_magnifier.0.dart | 2 +- .../example/lib/text_field/text_field_tap_region.0.dart | 2 +- .../material_state/material_state_outlined_border.0_test.dart | 2 +- .../example/test/text_field/text_field_magnifier.0_test.dart | 2 +- .../example/test/text_field/text_field_tap_region.0_test.dart | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/material_ui/example/lib/material_state/material_state_outlined_border.0.dart b/packages/material_ui/example/lib/material_state/material_state_outlined_border.0.dart index d58c5dc027a6..0ba557ec282e 100644 --- a/packages/material_ui/example/lib/material_state/material_state_outlined_border.0.dart +++ b/packages/material_ui/example/lib/material_state/material_state_outlined_border.0.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/material_ui/example/lib/text_field/text_field_magnifier.0.dart b/packages/material_ui/example/lib/text_field/text_field_magnifier.0.dart index 37183e1eb929..8a37af835f9f 100644 --- a/packages/material_ui/example/lib/text_field/text_field_magnifier.0.dart +++ b/packages/material_ui/example/lib/text_field/text_field_magnifier.0.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/material_ui/example/lib/text_field/text_field_tap_region.0.dart b/packages/material_ui/example/lib/text_field/text_field_tap_region.0.dart index 8a485b2ffd52..8c6b396dfb59 100644 --- a/packages/material_ui/example/lib/text_field/text_field_tap_region.0.dart +++ b/packages/material_ui/example/lib/text_field/text_field_tap_region.0.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/material_ui/example/test/material_state/material_state_outlined_border.0_test.dart b/packages/material_ui/example/test/material_state/material_state_outlined_border.0_test.dart index 6d3cdf46b3d1..3106874cbf38 100644 --- a/packages/material_ui/example/test/material_state/material_state_outlined_border.0_test.dart +++ b/packages/material_ui/example/test/material_state/material_state_outlined_border.0_test.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/material_ui/example/test/text_field/text_field_magnifier.0_test.dart b/packages/material_ui/example/test/text_field/text_field_magnifier.0_test.dart index 86382e264f38..8a9e2facc53a 100644 --- a/packages/material_ui/example/test/text_field/text_field_magnifier.0_test.dart +++ b/packages/material_ui/example/test/text_field/text_field_magnifier.0_test.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/material_ui/example/test/text_field/text_field_tap_region.0_test.dart b/packages/material_ui/example/test/text_field/text_field_tap_region.0_test.dart index 41ba403047c7..c0d508ff9322 100644 --- a/packages/material_ui/example/test/text_field/text_field_tap_region.0_test.dart +++ b/packages/material_ui/example/test/text_field/text_field_tap_region.0_test.dart @@ -1,4 +1,4 @@ -// Copyright 2013 The Flutter Authors. +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.