From 0cb27be654f2b9bd05d91d3fe4e7511465d7cdd0 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 11 Nov 2025 11:10:36 -0800 Subject: [PATCH 1/7] draft --- .../default-android-scrollbars.md | 302 ++++++++++++++++++ 1 file changed, 302 insertions(+) create mode 100644 src/content/release/breaking-changes/default-android-scrollbars.md diff --git a/src/content/release/breaking-changes/default-android-scrollbars.md b/src/content/release/breaking-changes/default-android-scrollbars.md new file mode 100644 index 00000000000..b613d102775 --- /dev/null +++ b/src/content/release/breaking-changes/default-android-scrollbars.md @@ -0,0 +1,302 @@ +--- +title: Default Scrollbars on Desktop +description: > + ScrollBehaviors will now automatically build Scrollbars on Desktop platforms. +--- + +{% render "docs/breaking-changes.md" %} + +## Summary + +`ScrollBehavior`s now automatically apply `Scrollbar`s to +scrolling widgets on desktop platforms - Mac, Windows and Linux. + +## Context + +Prior to this change, `Scrollbar`s were applied to scrolling widgets +manually by the developer across all platforms. This did not match +developer expectations when executing Flutter applications on desktop platforms. + +Now, the inherited `ScrollBehavior` applies a `Scrollbar` automatically +to most scrolling widgets. This is similar to how `GlowingOverscrollIndicator` +is created by `ScrollBehavior`. The few widgets that are exempt from this +behavior are listed below. + +To provide better management and control of this feature, `ScrollBehavior` +has also been updated. The `buildViewportChrome` method, which applied +a `GlowingOverscrollIndicator`, has been deprecated. Instead, `ScrollBehavior` +now supports individual methods for decorating the viewport, `buildScrollbar` +and `buildOverscrollIndicator`. These methods can be overridden to control +what is built around the scrollable. + +Furthermore, `ScrollBehavior` subclasses `MaterialScrollBehavior` and +`CupertinoScrollBehavior` have been made public, allowing developers to extend +and build upon the other existing `ScrollBehavior`s in the framework. These +subclasses were previously private. + + +## Description of change + + + +The previous approach called on developers to create their own `Scrollbar`s on +all platforms. In some use cases, a `ScrollController` would need to be provided +to the `Scrollbar` and the scrollable widget. + +```dart +final ScrollController controller = ScrollController(); +Scrollbar( + controller: controller, + child: ListView.builder( + controller: controller, + itemBuilder: (BuildContext context, int index) { + return Text('Item $index'); + } + ) +); +``` + +`MaterialScrollBehavior`, used by default by `MaterialApp`, + now applies a `Scrollbar` automatically +when executing on Android, and handles providing the `ScrollController` +to the `Scrollbar` for you. + +```dart +final ScrollController controller = ScrollController(); + +// If using MaterialApp... +MaterialApp( +home: ListView.builder( + controller: controller, + itemBuilder: (BuildContext context, int index) { + return Text('Item $index'); + } + ), +); + +// Otherwise... +WidgetsApp( + scrollBehavior: MaterialScrollBehavior(), + home: ListView.builder( + controller: controller, + itemBuilder: (BuildContext context, int index) { + return Text('Item $index'); + } + ), +); +``` + + +Some widgets in the framework are exempt from +this automatic `Scrollbar` application. +They are: + +- `EditableText`, when `maxLines` is 1. +- `ListWheelScrollView` +- `PageView` +- `NestedScrollView` + +Since `MaterialApp` automatically uses `MaterialScrollBehavior`, and thus, +will automatically apply a `Scrollbar`, you must override the `MaterialApp`'s +`scrollBehavior` parameter to choose otherwise or customize the `Scrollbar` +shown. + +This change did not cause any test failures, crashes, or error messages +in the course of development, but it may result in two `Scrollbar`s +being rendered in your application if you are manually adding `Scrollbar`s +on Android. + +If you are seeing this in your application, there are several ways to +control and configure this feature. + +- Remove the manually applied `Scrollbar`s in your + application when running on Android. + +- Extend `MaterialScrollBehavior` to modify the default behavior. + + - With your own `ScrollBehavior`, you can apply it app-wide by setting + `MaterialApp.scrollBehavior`. + + - Or, if you wish to only apply it to specific widgets, add a + `ScrollConfiguration` above the widget in question with your + custom `ScrollBehavior`. + +Your scrollable widgets then inherits this and reflects this behavior. + +- Instead of creating your own `ScrollBehavior`, another option for changing + the default behavior is to copy the existing `ScrollBehavior`, and toggle the + desired feature. + - Create a `ScrollConfiguration` in your widget tree, and + provide a modified copy of the existing `ScrollBehavior` in + the current context using `copyWith`. + +## Migration guide + +### Removing manual `Scrollbar`s on Android + +Code before migration: + +```dart +final ScrollController controller = ScrollController(); +Scrollbar( + controller: controller, + child: ListView.builder( + controller: controller, + itemBuilder: (BuildContext context, int index) { + return Text('Item $index'); + } + ) +); +``` + +Code after migration: + +```dart +final ScrollController controller = ScrollController(); +final Widget child = ListView.builder( + controller: controller, + itemBuilder: (BuildContext context, int index) { + return Text('Item $index'); + } +); +// Only manually add a `Scrollbar` when not on Android or desktop platforms. +// Or, see other migrations for changing `ScrollBehavior`. +switch (currentPlatform) { + case TargetPlatform.linux: + case TargetPlatform.macOS: + case TargetPlatform.windows: + case TargetPlatform.android: + return child; + case TargetPlatform.fuchsia: + case TargetPlatform.iOS: + return Scrollbar( + controller: controller, + child: child; + ); +} +``` + +### Setting a custom `ScrollBehavior` for your application + +Code before migration: + +```dart +MaterialApp( + // ... +); +``` + +Code after migration: + +```dart +class MyCustomScrollBehavior extends MaterialScrollBehavior { + // Override behavior methods like buildOverscrollIndicator and buildScrollbar +} + +// ScrollBehavior can now be configured for an entire application. +MaterialApp( + scrollBehavior: MyCustomScrollBehavior(), + // ... +); +``` + +### Setting a custom `ScrollBehavior` for a specific widget + +Code before migration: + +```dart +final ScrollController controller = ScrollController(); +ListView.builder( + controller: controller, + itemBuilder: (BuildContext context, int index) { + return Text('Item $index'); + } +); +``` + +Code after migration: + +```dart +class MyCustomScrollBehavior extends MaterialScrollBehavior { + // Override behavior methods like buildOverscrollIndicator and buildScrollbar +} + +// ScrollBehavior can be set for a specific widget. +final ScrollController controller = ScrollController(); +ScrollConfiguration( + behavior: MyCustomScrollBehavior(), + child: ListView.builder( + controller: controller, + itemBuilder: (BuildContext context, int index) { + return Text('Item $index'); + } + ), +); +``` + + +### Copy and modify existing `ScrollBehavior` + +Code before migration: + +```dart +final ScrollController controller = ScrollController(); +ListView.builder( + controller: controller, + itemBuilder: (BuildContext context, int index) { + return Text('Item $index'); + } +); +``` + +Code after migration: + +```dart +// ScrollBehavior can be copied and adjusted. +final ScrollController controller = ScrollController(); +ScrollConfiguration( + behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false), + child: ListView.builder( + controller: controller, + itemBuilder: (BuildContext context, int index) { + return Text('Item $index'); + } + ), +); +``` + +## Timeline + +Landed in version: ?????
+In stable release: ???? + +## References + +API documentation: + +* [`ScrollConfiguration`][] +* [`ScrollBehavior`][] +* [`MaterialScrollBehavior`][] +* [`CupertinoScrollBehavior`][] +* [`Scrollbar`][] +* [`CupertinoScrollbar`][] + +Relevant issues: + +* [Issue #40107][]??????? + +Relevant PRs: + +* [Exposing ScrollBehaviors for app-wide settings][]?????? + + +[`ScrollConfiguration`]: {{site.api}}/flutter/widgets/ScrollConfiguration-class.html +[`ScrollBehavior`]: {{site.api}}/flutter/widgets/ScrollBehavior-class.html +[`MaterialScrollBehavior`]: {{site.api}}/flutter/material/MaterialScrollBehavior-class.html +[`CupertinoScrollBehavior`]: {{site.api}}/flutter/cupertino/CupertinoScrollBehavior-class.html +[`Scrollbar`]: {{site.api}}/flutter/material/Scrollbar-class.html +[`CupertinoScrollbar`]: {{site.api}}/flutter/cupertino/CupertinoScrollbar-class.html +[Issue #40107]: {{site.repo.flutter}}/issues/40107 +[Issue #70866]: {{site.repo.flutter}}/issues/70866 +[Exposing ScrollBehaviors for app-wide settings]: {{site.repo.flutter}}/pull/76739 +[Automatically applying Scrollbars on desktop platforms with configurable ScrollBehaviors]: {{site.repo.flutter}}/pull/78588 From 083d6ac80f19e61826f8dad679392aa01a34f6f2 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 18 Nov 2025 10:52:27 -0800 Subject: [PATCH 2/7] draft --- .../default-android-scrollbars.md | 208 ++++++++---------- 1 file changed, 90 insertions(+), 118 deletions(-) diff --git a/src/content/release/breaking-changes/default-android-scrollbars.md b/src/content/release/breaking-changes/default-android-scrollbars.md index b613d102775..adc6c37806e 100644 --- a/src/content/release/breaking-changes/default-android-scrollbars.md +++ b/src/content/release/breaking-changes/default-android-scrollbars.md @@ -1,50 +1,41 @@ --- -title: Default Scrollbars on Desktop +title: Default Scrollbars on Android description: > - ScrollBehaviors will now automatically build Scrollbars on Desktop platforms. + MaterialScrollBehavior will now automatically build Scrollbars on Android. --- {% render "docs/breaking-changes.md" %} ## Summary -`ScrollBehavior`s now automatically apply `Scrollbar`s to -scrolling widgets on desktop platforms - Mac, Windows and Linux. +`MaterialScrollBehavior` will now automatically apply a `Scrollbar` to +scrolling widgets on Android. ## Context -Prior to this change, `Scrollbar`s were applied to scrolling widgets -manually by the developer across all platforms. This did not match -developer expectations when executing Flutter applications on desktop platforms. - -Now, the inherited `ScrollBehavior` applies a `Scrollbar` automatically -to most scrolling widgets. This is similar to how `GlowingOverscrollIndicator` -is created by `ScrollBehavior`. The few widgets that are exempt from this -behavior are listed below. - -To provide better management and control of this feature, `ScrollBehavior` -has also been updated. The `buildViewportChrome` method, which applied -a `GlowingOverscrollIndicator`, has been deprecated. Instead, `ScrollBehavior` -now supports individual methods for decorating the viewport, `buildScrollbar` -and `buildOverscrollIndicator`. These methods can be overridden to control -what is built around the scrollable. - -Furthermore, `ScrollBehavior` subclasses `MaterialScrollBehavior` and -`CupertinoScrollBehavior` have been made public, allowing developers to extend -and build upon the other existing `ScrollBehavior`s in the framework. These -subclasses were previously private. +Prior to this change, `Scrollbar`s were only applied automatically to +scrolling widgets on desktop platforms - Mac, Windows and Linux. On all +other platforms, a `Scrollbar` could only be applied manually by the +developer, including Android. This does not match Android's default +behavior for scrollable `View`s nor its quality guidelines for running +on large screens; see [Large Screen Quality Guideline T1-10]. +Now, `MaterialScrollBehavior`, the default `ScrollBehavior` for all +`MaterialApp`s, applies a `Scrollbar` automatically to most scrolling +widgets. This is similar to how the inherited `ScrollBehavior` +automatically applies a `Scrollbar` on all desktop platforms. The few +widgets that are exempt from this behavior are listed below. ## Description of change - - -The previous approach called on developers to create their own `Scrollbar`s on -all platforms. In some use cases, a `ScrollController` would need to be provided -to the `Scrollbar` and the scrollable widget. +The previous approach called on developers to create their own `Scrollbar`s +on all non-desktop platforms, including Android. In some use cases, a +`ScrollController` would need to be provided to the `Scrollbar` and +the scrollable widget. ```dart final ScrollController controller = ScrollController(); + Scrollbar( controller: controller, child: ListView.builder( @@ -56,15 +47,33 @@ Scrollbar( ); ``` -`MaterialScrollBehavior`, used by default by `MaterialApp`, - now applies a `Scrollbar` automatically -when executing on Android, and handles providing the `ScrollController` -to the `Scrollbar` for you. +Now, you can specify a `ScrollConfiguration` with the `MaterialScrollBehavior` +scroll behavior to build a `Scrollbar` automatically on Android: + +```dart +WidgetsApp( + builder: (context, child) { + return ScrollConfiguration( + behavior: MaterialScrollBehavior(), + child: ListView.builder( + controller: controller, + itemBuilder: (BuildContext context, int index) { + return Text('Item $index'); + }, + ), + ); + }, +); +``` + +`MaterialScrollBehavior`, the scroll behavior that `MaterialApp` applies by default, +now applies a `Scrollbar` automatically when executing on Android, +and handles providing the `ScrollController` to the `Scrollbar` +for you. ```dart final ScrollController controller = ScrollController(); -// If using MaterialApp... MaterialApp( home: ListView.builder( controller: controller, @@ -73,32 +82,18 @@ home: ListView.builder( } ), ); - -// Otherwise... -WidgetsApp( - scrollBehavior: MaterialScrollBehavior(), - home: ListView.builder( - controller: controller, - itemBuilder: (BuildContext context, int index) { - return Text('Item $index'); - } - ), -); ``` - -Some widgets in the framework are exempt from -this automatic `Scrollbar` application. -They are: +Some widgets in the framework are exempt from this automatic `Scrollbar` +application. They are: - `EditableText`, when `maxLines` is 1. - `ListWheelScrollView` - `PageView` -- `NestedScrollView` -Since `MaterialApp` automatically uses `MaterialScrollBehavior`, and thus, -will automatically apply a `Scrollbar`, you must override the `MaterialApp`'s -`scrollBehavior` parameter to choose otherwise or customize the `Scrollbar` +Since `MaterialApp` automatically uses `MaterialScrollBehavior`, +you must override the `MaterialApp`'s `scrollBehavior` parameter +to choose a different `ScrollBehavior` or customize the `Scrollbar` shown. This change did not cause any test failures, crashes, or error messages @@ -116,13 +111,10 @@ control and configure this feature. - With your own `ScrollBehavior`, you can apply it app-wide by setting `MaterialApp.scrollBehavior`. - - Or, if you wish to only apply it to specific widgets, add a `ScrollConfiguration` above the widget in question with your custom `ScrollBehavior`. -Your scrollable widgets then inherits this and reflects this behavior. - - Instead of creating your own `ScrollBehavior`, another option for changing the default behavior is to copy the existing `ScrollBehavior`, and toggle the desired feature. @@ -132,35 +124,43 @@ Your scrollable widgets then inherits this and reflects this behavior. ## Migration guide -### Removing manual `Scrollbar`s on Android - -Code before migration: +Before migration, if you are using a `MaterialApp`, you may have some code +that looks like: ```dart final ScrollController controller = ScrollController(); -Scrollbar( - controller: controller, - child: ListView.builder( + +MaterialApp( + home: Scrollbar( controller: controller, - itemBuilder: (BuildContext context, int index) { - return Text('Item $index'); - } + child: ListView.builder( + controller: controller, + itemBuilder: (BuildContext context, int index) { + return Text('Item $index'); + } + ) ) ); ``` +See the following strategies for how to migrate this code. + +### Removing manual `Scrollbar`s on Android when using `MaterialApp` + Code after migration: ```dart final ScrollController controller = ScrollController(); + final Widget child = ListView.builder( controller: controller, itemBuilder: (BuildContext context, int index) { return Text('Item $index'); } ); -// Only manually add a `Scrollbar` when not on Android or desktop platforms. -// Or, see other migrations for changing `ScrollBehavior`. + +// Only manually add a `Scrollbar` when not on Android or desktop platforms, +// or see other migrations for changing `ScrollBehavior`. switch (currentPlatform) { case TargetPlatform.linux: case TargetPlatform.macOS: @@ -174,54 +174,45 @@ switch (currentPlatform) { child: child; ); } + +MaterialApp(home: child); ``` ### Setting a custom `ScrollBehavior` for your application -Code before migration: - -```dart -MaterialApp( - // ... -); -``` - Code after migration: ```dart +// Extend any `ScrollBehavior` that you would like. class MyCustomScrollBehavior extends MaterialScrollBehavior { - // Override behavior methods like buildOverscrollIndicator and buildScrollbar + // Override behavior methods like buildOverscrollIndicator and buildScrollbar. } -// ScrollBehavior can now be configured for an entire application. +// MyCustomScrollBehavior can now be configured for an entire application. +final ScrollController controller = ScrollController(); MaterialApp( scrollBehavior: MyCustomScrollBehavior(), - // ... + home: ListView.builder( + controller: controller, + itemBuilder: (BuildContext context, int index) { + return Text('Item $index'); + } + ) ); ``` ### Setting a custom `ScrollBehavior` for a specific widget -Code before migration: - -```dart -final ScrollController controller = ScrollController(); -ListView.builder( - controller: controller, - itemBuilder: (BuildContext context, int index) { - return Text('Item $index'); - } -); -``` - Code after migration: ```dart +// Extend any `ScrollBehavior` that you would like. class MyCustomScrollBehavior extends MaterialScrollBehavior { - // Override behavior methods like buildOverscrollIndicator and buildScrollbar + // Override behavior methods like buildOverscrollIndicator and buildScrollbar. } -// ScrollBehavior can be set for a specific widget. + +// MyCustomScrollBehavior can be set for a specific widget. final ScrollController controller = ScrollController(); ScrollConfiguration( behavior: MyCustomScrollBehavior(), @@ -234,21 +225,8 @@ ScrollConfiguration( ); ``` - ### Copy and modify existing `ScrollBehavior` -Code before migration: - -```dart -final ScrollController controller = ScrollController(); -ListView.builder( - controller: controller, - itemBuilder: (BuildContext context, int index) { - return Text('Item $index'); - } -); -``` - Code after migration: ```dart @@ -267,8 +245,8 @@ ScrollConfiguration( ## Timeline -Landed in version: ?????
-In stable release: ???? +Landed in version: 3.40.0-0.1.pre
+In stable release: 3.40.0 ## References @@ -277,26 +255,20 @@ API documentation: * [`ScrollConfiguration`][] * [`ScrollBehavior`][] * [`MaterialScrollBehavior`][] -* [`CupertinoScrollBehavior`][] * [`Scrollbar`][] -* [`CupertinoScrollbar`][] Relevant issues: -* [Issue #40107][]??????? +* [Issue #170540][] Relevant PRs: -* [Exposing ScrollBehaviors for app-wide settings][]?????? - +* [Modify MaterialScrollBehavior to show scrollbar by default][] +[Large Screen Quality Guideline T1-10]: https://developer.android.com/docs/quality-guidelines/large-screen-app-quality#T1-10 [`ScrollConfiguration`]: {{site.api}}/flutter/widgets/ScrollConfiguration-class.html [`ScrollBehavior`]: {{site.api}}/flutter/widgets/ScrollBehavior-class.html [`MaterialScrollBehavior`]: {{site.api}}/flutter/material/MaterialScrollBehavior-class.html -[`CupertinoScrollBehavior`]: {{site.api}}/flutter/cupertino/CupertinoScrollBehavior-class.html [`Scrollbar`]: {{site.api}}/flutter/material/Scrollbar-class.html -[`CupertinoScrollbar`]: {{site.api}}/flutter/cupertino/CupertinoScrollbar-class.html -[Issue #40107]: {{site.repo.flutter}}/issues/40107 -[Issue #70866]: {{site.repo.flutter}}/issues/70866 -[Exposing ScrollBehaviors for app-wide settings]: {{site.repo.flutter}}/pull/76739 -[Automatically applying Scrollbars on desktop platforms with configurable ScrollBehaviors]: {{site.repo.flutter}}/pull/78588 +[Issue #170540]: {{site.repo.flutter}}/issues/170540 +[Modify MaterialScrollBehavior to show scrollbar by default]: {{site.repo.flutter}}/pull/178308 From 1d7a5d6e5dee64ae12eb4b9a33ef17e1a2d68676 Mon Sep 17 00:00:00 2001 From: Shams Zakhour <44418985+sfshaza2@users.noreply.github.com> Date: Tue, 18 Nov 2025 12:27:13 -0800 Subject: [PATCH 3/7] Update src/content/release/breaking-changes/default-android-scrollbars.md --- .../release/breaking-changes/default-android-scrollbars.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/release/breaking-changes/default-android-scrollbars.md b/src/content/release/breaking-changes/default-android-scrollbars.md index adc6c37806e..9135f01a2c1 100644 --- a/src/content/release/breaking-changes/default-android-scrollbars.md +++ b/src/content/release/breaking-changes/default-android-scrollbars.md @@ -18,7 +18,7 @@ scrolling widgets on desktop platforms - Mac, Windows and Linux. On all other platforms, a `Scrollbar` could only be applied manually by the developer, including Android. This does not match Android's default behavior for scrollable `View`s nor its quality guidelines for running -on large screens; see [Large Screen Quality Guideline T1-10]. +on large screens; see [Large Screen Quality Guideline T1-10][]. Now, `MaterialScrollBehavior`, the default `ScrollBehavior` for all `MaterialApp`s, applies a `Scrollbar` automatically to most scrolling From b1c7161196aa8475187a281755977a1ba8e34d9b Mon Sep 17 00:00:00 2001 From: Shams Zakhour <44418985+sfshaza2@users.noreply.github.com> Date: Tue, 18 Nov 2025 12:27:21 -0800 Subject: [PATCH 4/7] Update src/content/release/breaking-changes/default-android-scrollbars.md --- .../release/breaking-changes/default-android-scrollbars.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/release/breaking-changes/default-android-scrollbars.md b/src/content/release/breaking-changes/default-android-scrollbars.md index 9135f01a2c1..44cab9fbe01 100644 --- a/src/content/release/breaking-changes/default-android-scrollbars.md +++ b/src/content/release/breaking-changes/default-android-scrollbars.md @@ -97,7 +97,7 @@ to choose a different `ScrollBehavior` or customize the `Scrollbar` shown. This change did not cause any test failures, crashes, or error messages -in the course of development, but it may result in two `Scrollbar`s +in the course of development, but it might result in two `Scrollbar`s being rendered in your application if you are manually adding `Scrollbar`s on Android. From 29a265f87137b9c9b6cab612a38d79e9ccceb476 Mon Sep 17 00:00:00 2001 From: Shams Zakhour <44418985+sfshaza2@users.noreply.github.com> Date: Tue, 18 Nov 2025 12:27:32 -0800 Subject: [PATCH 5/7] Update src/content/release/breaking-changes/default-android-scrollbars.md --- .../release/breaking-changes/default-android-scrollbars.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/release/breaking-changes/default-android-scrollbars.md b/src/content/release/breaking-changes/default-android-scrollbars.md index 44cab9fbe01..7f0f50b216d 100644 --- a/src/content/release/breaking-changes/default-android-scrollbars.md +++ b/src/content/release/breaking-changes/default-android-scrollbars.md @@ -124,7 +124,7 @@ control and configure this feature. ## Migration guide -Before migration, if you are using a `MaterialApp`, you may have some code +Before migration, if you are using a `MaterialApp`, you might have some code that looks like: ```dart From 6e479a840c6d81a1dcefac8fa710e8e38e655542 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Mon, 24 Nov 2025 11:20:33 -0800 Subject: [PATCH 6/7] add to index --- src/content/release/breaking-changes/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/content/release/breaking-changes/index.md b/src/content/release/breaking-changes/index.md index ef6a3744604..d0ece5543e9 100644 --- a/src/content/release/breaking-changes/index.md +++ b/src/content/release/breaking-changes/index.md @@ -41,12 +41,14 @@ They're sorted by release and listed in alphabetical order: * [`$FLUTTER_ROOT/version` replaced by `$FLUTTER_ROOT/bin/cache/flutter.version.json`][] * [Stop generating `AssetManifest.json`][] * [Deprecate `TextField.canRequestFocus`][] +* [MaterialScrollBehavior will now automatically build Scrollbars on Android][] [`FontWeight` also controls the weight attribute of variable fonts]: /release/breaking-changes/font-weight-variation [UISceneDelegate adoption]: /release/breaking-changes/uiscenedelegate [Stop generating `AssetManifest.json`]: /release/breaking-changes/asset-manifest-dot-json [`$FLUTTER_ROOT/version` replaced by `$FLUTTER_ROOT/bin/cache/flutter.version.json`]: /release/breaking-changes/flutter-root-version-file [Deprecate `TextField.canRequestFocus`]: /release/breaking-changes/can-request-focus +[MaterialScrollBehavior will now automatically build Scrollbars on Android]: /release/breaking-changes/default-android-scrollbars ### Released in Flutter 3.38 From 6f6ac3135dc8c40f4cfc960d13d997ca33c195ee Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Mon, 24 Nov 2025 11:22:34 -0800 Subject: [PATCH 7/7] format + fix timeline --- .../release/breaking-changes/default-android-scrollbars.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/release/breaking-changes/default-android-scrollbars.md b/src/content/release/breaking-changes/default-android-scrollbars.md index 7f0f50b216d..c70a43367b5 100644 --- a/src/content/release/breaking-changes/default-android-scrollbars.md +++ b/src/content/release/breaking-changes/default-android-scrollbars.md @@ -75,7 +75,7 @@ for you. final ScrollController controller = ScrollController(); MaterialApp( -home: ListView.builder( + home: ListView.builder( controller: controller, itemBuilder: (BuildContext context, int index) { return Text('Item $index'); @@ -245,8 +245,8 @@ ScrollConfiguration( ## Timeline -Landed in version: 3.40.0-0.1.pre
-In stable release: 3.40.0 +Landed in version: Not yet
+In stable release: Not yet ## References