10908 Commits

Author SHA1 Message Date
Masatoshi Tsushima
0da8012cc7
Fix: Closing bottom sheet and removing FAB cause assertion failure (#128566)
Fixes #128562
2023-06-22 17:00:58 +00:00
Taha Tesser
2e05371c88
Add InputDecorationTheme.merge (#129011)
fixes [[Proposal] `InputDecorationTheme.merge()`](https://github.com/flutter/flutter/issues/125471)
2023-06-22 16:02:08 +00:00
Yegor
07772a3d23
[framework,web] add FlutterTimeline and semantics benchmarks that use it (#128366)
## FlutterTimeline

Add a new class `FlutterTimeline` that's a drop-in replacement for `Timeline` from `dart:developer`. In addition to forwarding invocations of `startSync`, `finishSync`, `timeSync`, and `instantSync` to `dart:developer`, provides the following extra methods that make is easy to collect timings for code blocks on a frame-by-frame basis:

* `debugCollect()` - aggregates timings since the last reset, or since the app launched.
* `debugReset()` - forgets all data collected since the previous reset, or since the app launched. This allows clearing data from previous frames so timings can be attributed to the current frame.
* `now` - this was enhanced so that it works on the web by calling `window.performance.now` (in `Timeline` this is a noop in Dart web compilers).
* `collectionEnabled` - a field that controls whether `FlutterTimeline` stores timings in memory. By default this is disabled to avoid unexpected overhead (although the class is designed for minimal and predictable overhead). Specific benchmarks can enable collection to report to Skia Perf.

## Semantics benchmarks

Add `BenchMaterial3Semantics` that benchmarks the cost of semantics when constructing a screen full of Material 3 widgets from nothing. It is expected that semantics will have non-trivial cost in this case, but we should strive to keep it much lower than the rendering cost. This is the case already. This benchmark shows that the cost of semantics is <10%.

Add `BenchMaterial3ScrollSemantics` that benchmarks the cost of scrolling a previously constructed screen full of Material 3 widgets. The expectation should be that semantics will have trivial cost, since we're just shifting some widgets around. As of today, the numbers are not great, with semantics taking >50% of frame time, which is what prompted this PR in the first place. As we optimize this, we want to see this number improve.
2023-06-21 21:37:02 +00:00
Pierre-Louis
28ca523ac2
Remove incorrect non-nullable assumption from ShapeDecoration.lerp (#129298)
Fixes https://github.com/flutter/flutter/issues/129299
2023-06-21 21:34:58 +00:00
Justin McCandless
16eb4f2c08
Gracefully handle negative position in getWordAtOffset (#128464)
Should fix an unreproducible crash in text editing and track it with an assertion.
2023-06-21 14:22:04 -07:00
Renzo Olivares
b36ef583fb
Selection area right click behavior should match native (#128224)
This change updates `SelectableRegion`s right-click gesture to match native platform behavior.

Before: Right-click gesture selects word at position and opens context menu (All Platforms)
After: 
- Linux, toggles context menu on/off, and collapses selection when click was not on an active selection (uncollapsed).
- Windows, Android, Fuchsia, shows context menu at right-clicked position (unless the click is at an active selection).
- macOS, toggles the context menu if right click was at the same position as the previous / or selects word at position and opens context menu.
- iOS, selects word at position and opens context menu.

This change also prevents the `copy` menu button from being shown when there is a collapsed selection (nothing to copy).

Fixes #117561
2023-06-21 19:32:04 +00:00
LongCatIsLooong
04ff86f020
Relax OverlayPortal asserts (#129053)
Fixes https://github.com/flutter/flutter/issues/129025

Also 
- simplifies OverlayPortal code a bit and adds an assert.
-  `Tooltip` shouldn't rebuild when hiding/showing the tooltip
2023-06-21 02:40:48 +00:00
Andrew Kolos
e1e45ca37a
update resolution-aware asset docs links (#128769)
Updates some doc comment links.

Fixes https://github.com/flutter/flutter/issues/128139
2023-06-20 23:45:52 +00:00
Justin McCandless
40b4bc996c
Fix: Magnifier appears and won't dismiss (#128545)
Fixes a bug when tapping near certain TextFields.
2023-06-20 16:36:45 -07:00
Tae Hyung Kim
541fdd60d3
DecoratedSliver (#127823)
This is a second attempt to merge #107269. Currently I've fixed two of the issues:
1. Fixed horizontal scrollview by using a switch statement to consider vertical/horizontal case.
2. Fixed issue of `paintExtent` not being the right extent for painting. Rather using a `scrollExtent` for the main axis length of the decoration box and painting it offsetted by the `scrollOffset`.
3. If the sliver child has inifinite scrollExtent, then we only draw the decoration down to the bottom of the `cacheExtent`. The developer is expected to ensure that the border does not creep up above the cache area.

This PR includes a test that checks that the correct rectangle is drawn at a certain scrollOffset for both the horizontal and vertical case which should be sufficient for checking that `SliverDecoration` works properly now.

Fixes https://github.com/flutter/flutter/issues/107498.
2023-06-20 23:35:42 +00:00
Md. Yeasin Sheikh
b733901de1
fixed PreferredSize constuctor invocations (#128181)
This PR changes the `PreferredSize` constructor parameter positioning to cover the constructor invocations. It helps on auto-complete and suggestion. 

*List which issues are fixed by this PR. You must list at least one issue.*
Fixes #128178
2023-06-20 22:21:12 +00:00
Swaroop S
80935ad984
Adding ScrollController support for Stepper widget (#128814)
This PR is to add **controller** property to the **Stepper** widget, so
that user has the flexibility to control the scroll offset for various
purposes(especially in case of scroll animations)!

Fixes #61207 

Co-authored-by: Taha Tesser <tessertaha@gmail.com>
2023-06-20 09:04:41 -07:00
Leigha Jarett
b2c993cad3
Add to API docs to explain what Assist and Suggestion chips are (#129034)
Fixes https://github.com/flutter/flutter/issues/128028. 

It seems pretty straightforward so don't think it warrants the effort to add more samples.
2023-06-20 09:03:21 +00:00
Taha Tesser
467c970bfb
Introduce MaterialState color property for chips (#128584)
fixes https://github.com/flutter/flutter/issues/115827
fixes https://github.com/flutter/flutter/issues/101325

### Description
1. This PR adds a new MaterialState `color` property to all the chips (this makes it possible to customize chips in all states from the M3 specs).
2. Updated defaults to use the new  MaterialState `color` property.
3. Updated and added new tests to all the chip test classes.

<details> 
<summary>code sample</summary> 

```dart
import 'package:flutter/material.dart';

const Color disabledColor = Colors.black26;
const Color backgroundColor = Colors.cyan;
final Color disabledSelectedColor = Colors.red.shade100;
const Color selectedColor = Colors.amber;
final MaterialStateProperty<Color> color =
    MaterialStateProperty.resolveWith((Set<MaterialState> states) {
  if (states.contains(MaterialState.disabled) &&
      states.contains(MaterialState.selected)) {
    return disabledSelectedColor;
  }
  if (states.contains(MaterialState.disabled)) {
    return disabledColor;
  }
  if (states.contains(MaterialState.selected)) {
    return selectedColor;
  }
  return backgroundColor;
});

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        useMaterial3: true,
        // chipTheme: ChipThemeData(color: color),
      ),
      home: const Example(),
    );
  }
}

class Example extends StatefulWidget {
  const Example({super.key});

  @override
  State<Example> createState() => _ExampleState();
}

class _ExampleState extends State<Example> {
  bool enabled = false;
  bool selected = true;

  @override
  Widget build(BuildContext context) {
    const Widget verticalSpace = SizedBox(height: 20);

    return Scaffold(
      body: Center(
        child: Column(
          children: <Widget>[
            const SizedBox(height: 25),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: <Widget>[
                const Card(
                  elevation: 0.0,
                  color: disabledColor,
                  child: Padding(
                    padding: EdgeInsets.all(8.0),
                    child: Text('disabledColor'),
                  ),
                ),
                const Card(
                  elevation: 0.0,
                  color: backgroundColor,
                  child: Padding(
                    padding: EdgeInsets.all(8.0),
                    child: Text('backgroundColor'),
                  ),
                ),
                Card(
                  elevation: 0.0,
                  color: disabledSelectedColor,
                  child: const Padding(
                    padding: EdgeInsets.all(8.0),
                    child: Text('disabledSelectedColor'),
                  ),
                ),
                const Card(
                  elevation: 0.0,
                  color: selectedColor,
                  child: Padding(
                    padding: EdgeInsets.all(8.0),
                    child: Text('selectedColor'),
                  ),
                ),
              ],
            ),
            const Spacer(),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: <Widget>[
                Column(
                  mainAxisSize: MainAxisSize.min,
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    RawChip(
                      selected: selected,
                      selectedColor: selectedColor,
                      color: color,
                      label: const Text('RawChip'),
                      isEnabled: enabled,
                      onSelected: enabled ? (bool value) {} : null,
                    ),
                    verticalSpace,
                    InputChip(
                      isEnabled: enabled,
                      selected: selected,
                      selectedColor: selectedColor,
                      color: color,
                      label: const Text('InputChip'),
                      onSelected: enabled ? (bool value) {} : null,
                    ),
                  ],
                ),
                Column(
                  mainAxisSize: MainAxisSize.min,
                  children: <Widget>[
                    FilterChip(
                      selected: selected,
                      selectedColor: selectedColor,
                      color: color,
                      label: const Text('FilterChip'),
                      onSelected: enabled ? (bool value) {} : null,
                    ),
                    verticalSpace,
                    FilterChip.elevated(
                      selected: selected,
                      selectedColor: selectedColor,
                      color: color,
                      label: const Text('FilterChip.elevated'),
                      onSelected: enabled ? (bool value) {} : null,
                    ),
                  ],
                ),
                Column(
                  mainAxisSize: MainAxisSize.min,
                  children: <Widget>[
                    ChoiceChip(
                      selected: selected,
                      selectedColor: selectedColor,
                      color: color,
                      label: const Text('ChoiceChip'),
                      onSelected: enabled ? (bool value) {} : null,
                    ),
                    verticalSpace,
                    ChoiceChip.elevated(
                      selected: selected,
                      selectedColor: selectedColor,
                      color: color,
                      label: const Text('ChoiceChip.elevated'),
                      onSelected: enabled ? (bool value) {} : null,
                    ),
                  ],
                ),
              ],
            ),
            const Spacer(),
            Row(
              children: <Widget>[
                Flexible(
                  child: SwitchListTile(
                    title: const Text('Enabled'),
                    value: enabled,
                    onChanged: (bool value) {
                      setState(() => enabled = value);
                    },
                  ),
                ),
                Flexible(
                  child: SwitchListTile(
                    title: const Text('Selected'),
                    value: selected,
                    onChanged: (bool value) {
                      setState(() => selected = value);
                    },
                  ),
                ),
              ],
            )
          ],
        ),
      ),
    );
  }
}

``` 
	
</details>

### Before (not possible to customize disabled and selected chips)

![Screenshot 2023-06-13 at 16 27 13](https://github.com/flutter/flutter/assets/48603081/633f09f7-16a1-469e-b326-b9cc0ed59242)

### After (using disabled and selected chips using the new  MaterialState `color` property)

![Screenshot 2023-06-13 at 16 26 53](https://github.com/flutter/flutter/assets/48603081/7f5dffb7-4074-4268-87c0-c059c2da67a8)
2023-06-19 22:03:26 +00:00
Taha Tesser
165d237792
Fix InputDecoration.applyDefaults ignoring some properties (#129010)
fixes [`InputDecoration.applyDefaults` ignores some properties](https://github.com/flutter/flutter/issues/127330)

<details> 
<summary>code sample</summary> 

```dart
import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(useMaterial3: true),
      home: const Example(),
    );
  }
}

class Example extends StatelessWidget {
  const Example({super.key});

  @override
  Widget build(BuildContext context) {
    const TextStyle textStyle = TextStyle(color: Color(0xFF00FFFF));
    const Color color = Color(0xFF00FF00);
    const InputBorder inputBorder = OutlineInputBorder(
      borderSide: BorderSide(
        color: Color(0xFF0000FF),
      ),
    );

    final InputDecoration appliedDefaults =
        const InputDecoration().applyDefaults(
      const InputDecorationTheme(
        labelStyle: textStyle,
        floatingLabelStyle: textStyle,
        helperStyle: textStyle,
        helperMaxLines: 2,
        hintStyle: textStyle,
        errorStyle: textStyle,
        errorMaxLines: 2,
        floatingLabelBehavior: FloatingLabelBehavior.never,
        floatingLabelAlignment: FloatingLabelAlignment.center,
        isDense: true,
        contentPadding: EdgeInsets.all(1.0),
        iconColor: color,
        prefixStyle: textStyle,
        prefixIconColor: color,
        suffixStyle: textStyle,
        suffixIconColor: color,
        counterStyle: textStyle,
        filled: true,
        fillColor: color,
        focusColor: color,
        hoverColor: color,
        errorBorder: inputBorder,
        focusedBorder: inputBorder,
        focusedErrorBorder: inputBorder,
        disabledBorder: inputBorder,
        enabledBorder: inputBorder,
        border: InputBorder.none,
        alignLabelWithHint: true,
        constraints: BoxConstraints(
            minWidth: 10, maxWidth: 20, minHeight: 30, maxHeight: 40),
      ),
    );

    return Scaffold(
      appBar: AppBar(
        title: const Text('InputDecoration().applyDefaults'),
      ),
      // Centered FilledButton.
      body: Center(
        child: SingleChildScrollView(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ColoredBox(
                color: appliedDefaults.labelStyle.toString().contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.labelStyle.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.floatingLabelStyle
                        .toString()
                        .contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.floatingLabelStyle.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.helperStyle.toString().contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.helperStyle.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.hintStyle.toString().contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.hintStyle.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.errorStyle.toString().contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.errorStyle.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.iconColor.toString().contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.iconColor.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.prefixStyle.toString().contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.prefixStyle.toString()),
              ),
              ColoredBox(
                color:
                    appliedDefaults.prefixIconColor.toString().contains('null')
                        ? Colors.red
                        : Colors.green,
                child: Text(appliedDefaults.prefixIconColor.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.suffixStyle.toString().contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.suffixStyle.toString()),
              ),
              ColoredBox(
                color:
                    appliedDefaults.suffixIconColor.toString().contains('null')
                        ? Colors.red
                        : Colors.green,
                child: Text(appliedDefaults.suffixIconColor.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.counterStyle.toString().contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.counterStyle.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.fillColor.toString().contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.fillColor.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.focusColor.toString().contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.focusColor.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.hoverColor.toString().contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.hoverColor.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.errorBorder.toString().contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.errorBorder.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.focusedBorder.toString().contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.focusedBorder.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.focusedErrorBorder
                        .toString()
                        .contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.focusedErrorBorder.toString()),
              ),
              ColoredBox(
                color:
                    appliedDefaults.disabledBorder.toString().contains('null')
                        ? Colors.red
                        : Colors.green,
                child: Text(appliedDefaults.disabledBorder.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.enabledBorder.toString().contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.enabledBorder.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.border.toString().contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.border.toString()),
              ),
              ColoredBox(
                color: appliedDefaults.constraints.toString().contains('null')
                    ? Colors.red
                    : Colors.green,
                child: Text(appliedDefaults.constraints.toString()),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
``` 
	
</details>

### Before

![before screenshot](https://github.com/flutter/flutter/assets/48603081/ae564e15-4029-4feb-810f-e46b9312a257)

### After
![after screenshot](https://github.com/flutter/flutter/assets/48603081/8924a1d8-ffde-494b-bf44-66dab4d28845)
2023-06-19 07:06:19 +00:00
Polina Cherkasova
9690394772
Update objectToDiagnosticsNode to stop failing. (#129027)
Prerequisite for https://github.com/flutter/devtools/pull/5918
2023-06-16 19:39:54 +00:00
Polina Cherkasova
7214cb28be
Accept Diagnosticable as input in inspector API. (#128962) 2023-06-16 10:45:34 -07:00
Michael Goderbauer
5ab5d82a39
Remove AbstractNode from RenderObject and deprecate it (#128973)
It's time to say good bye to an old friend. 
It has outlived its usefulness.
Farewell, AbstractNode! 🫡
2023-06-16 16:16:36 +00:00
Mouad Debbar
fc8856eb80
[web] Don't crash on const HtmlElementView() (#128965)
Previously, when the code contained `const HtmlElementView()` it would break even if it's guarded by `if (kIsWeb)`.

This PR makes it such that `const HtmlElementView()` is allowed but it still throws if it gets inserted into the widget tree by mistake on non-web platforms.

One improvement we can make in the future is to have a conditional import:
- `_html_element_view_web.dart` that contains the real `HtmlElementView` that can only be instantiated on web.
- `_html_element_view_io.dart` that contains a stub with an unimplemented `build()` method.

Fixes https://github.com/flutter/flutter/issues/43532
2023-06-16 13:53:05 +00:00
Polina Cherkasova
dd4a8150a8
Update getProperties to handle Diagnosticable as input. (#128897) 2023-06-15 17:04:46 -07:00
Qun Cheng
f8e8d89b85
Set Semantics.button to true for date widget (#128824)
Fixes #127863

This PR is to set `Semantics.button` to true for date widget in `DatePicker`.

https://github.com/flutter/flutter/assets/36861262/b366f25a-6bf3-4e3f-b944-ab71197b73e5
2023-06-15 20:13:07 +00:00
Mouad Debbar
b0188cd182
[web] Pass creation params to the platform view factory (#128146)
This concludes step 1 of the `HtmlElementView` improvements. It's now possible to pass creation params to platform view factories directly from `HtmlElementView`.

Here's a sample app using a single factory to render platform views in different colors:

<details>
  <summary>Code sample</summary>
  
  ```dart
import 'dart:js_interop';
import 'dart:ui_web' as ui_web;
import 'package:flutter/material.dart';
import 'package:web/web.dart' as web;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Platform View Demo',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Platform View Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              BoxWrapper('red'),
              BoxWrapper(null),
              BoxWrapper('blue'),
            ],
          ),
        ),
      ),
    );
  }
}

bool isRegistered = false;

class BoxWrapper extends StatelessWidget {
  const BoxWrapper(this.cssColor);

  final String? cssColor;

  void register() {
    if (isRegistered) return;
    isRegistered = true;

    ui_web.platformViewRegistry.registerViewFactory('my-platform-view', (
      id, {
      Object? params,
    }) {
      params as String?;

      final element = web.document.createElement('div'.toJS) as web.HTMLElement;
      element.textContent = 'Platform View'.toJS;
      element.style
        ..lineHeight = '100px'.toJS
        ..fontSize = '24px'.toJS
        ..backgroundColor = (params ?? 'pink').toJS
        ..textAlign = 'center'.toJS;
      return element;
    });
  }

  @override
  Widget build(BuildContext context) {
    register();
    return SizedBox(
      width: 200,
      height: 100,
      child: Card(
        child: HtmlElementView(
          viewType: 'my-platform-view',
          creationParams: cssColor,
        ),
      ),
    );
  }
}
  ```
</details>

![image](https://github.com/flutter/flutter/assets/1278212/4b62ed8b-2314-49d6-9b4a-5da849bf2a48)

Depends on https://github.com/flutter/engine/pull/42255

Part of https://github.com/flutter/flutter/issues/127030
2023-06-15 18:00:25 +00:00
Qun Cheng
7d950864a1
Update golden tests for material (#128839) 2023-06-14 16:09:27 -07:00
Polina Cherkasova
ed3d46305c
Update getChildrenSummaryTree to handle Diagnosticable as input. (#128833) 2023-06-14 23:01:22 +00:00
Ian Hickson
d64332a0aa
Improve the error message for non-normalized constraints (#127906)
We probably added RenderBox.layout after this error was created and of course we weren't writing tests back then...
2023-06-14 22:50:33 +00:00
Ian Hickson
34f39a208e
ContextAction.isEnabled needs a context (#127721)
...and lots of things that fall out from that
2023-06-14 22:47:06 +00:00
LouiseHsu
4effd9c46f
Remove temporary default case for PointerSignalKind (#128900)
This PR cleans up some prep that was added as part of
https://github.com/flutter/flutter/pull/120731 which was done to unblock
https://github.com/flutter/engine/pull/39637
Since the work done in that PR was reverted, this should be removed.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [ ] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] All existing and new tests are passing.
2023-06-14 14:50:37 -07:00
Mouad Debbar
95be76ab7e
[web] Migrate framework away from dart:html and package:js (#128580)
Use `package:web` and `dart:js_interop` instead.

Part of https://github.com/flutter/flutter/issues/127030
2023-06-14 17:43:39 +00:00
cruiser-baxter
52c4db8d33
Fixed slider value indicator not disappearing after a bit on desktop platform when slider is clicked not dragged (#128137)
In slider.dart within the _startInteraction method and within the below conditional.

"if (!_active && !hasFocus &&
_state.valueIndicatorController.status == AnimationStatus.completed)"

**Changed to:**

"f (!_active &&
_state.valueIndicatorController.status == AnimationStatus.completed)"
This allows the value indicator to disappear after a bit when clicked instead of dragged on Desktop platform. 

I also added a test in slider_test.dart to detect the bug if it ever returns.

Fixes https://github.com/flutter/flutter/issues/123313
2023-06-14 17:11:08 +00:00
Michael Goderbauer
16e6be8b39
Inline AbstractNode into SemanticsNode and Layer (#128467) 2023-06-14 09:36:41 -07:00
Kate Lovett
a0bfde9bfb
Fix ensureVisible and default focus traversal for reversed scrollables (#128756)
Fixes https://github.com/flutter/flutter/issues/128749

The ScrollPositionAlignmentPolicy does not account for AxisDirection, which meant default focus traversal of reversed scrollables did not work. The policy doesn't know about the axis direction, so this is corrected in the ScrollPosition where all the information is available before calling on the viewport for the new target scroll offset.

This fixes that by flipping the policy (unless explicit) so that focus traversal works.
2023-06-13 16:51:22 +00:00
Kate Lovett
9e0ad4c63f
Fix paint offset in reverse for 2D (#128724)
Fixes https://github.com/flutter/flutter/issues/128723

The paint offset was incorrectly being computed when one or both axis was in the reverse direction. Instead of using the paint extent, the child's size should be used.
2023-06-12 23:28:15 +00:00
nt4f04uNd
ad8c997817
Fix RangeSlider notifies start and end twice when participates in gesture arena (#128674)
Fixes https://github.com/flutter/flutter/issues/128433

This PR applies the same fix as we did for Slider https://github.com/flutter/flutter/pull/82152
2023-06-12 15:20:11 +00:00
Taha Tesser
ca5aa2329a
Update ListTile text defaults to use ColorScheme (#128581)
fixes https://github.com/flutter/flutter/issues/128569

<details> 
<summary>code sample</summary> 

```dart
import 'package:flutter/material.dart';

void main() {
  runApp(const ListTileApp());
}

class ListTileApp extends StatelessWidget {
  const ListTileApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        useMaterial3: true,
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.red).copyWith(
          onSurface: Colors.yellow,
          onSurfaceVariant: Colors.green,
        ),
      ),
      home: const Scaffold(
        body: Center(
          child: ListTile(
            title: Text('title'),
            subtitle: Text('subtitle'),
          ),
        ),
      ),
    );
  }
}

``` 
	
</details>

# Description
M3 ListTile couldn't be customized using `ColorScheme` colors. 

- This PR updates the list tile text defaults to `ColorScheme` text color tokens.
- Improved the `ListTile` template to use the token group.
- Update docs and tests.

```dart
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.red).copyWith(
          onSurface: Colors.yellow,
          onSurfaceVariant: Colors.green,
        ),
```

### Before

![Screenshot 2023-06-09 at 17 47 04](https://github.com/flutter/flutter/assets/48603081/c0130371-3c7c-428c-bb57-504822cf64b5)

### After

![Screenshot 2023-06-09 at 17 46 17](https://github.com/flutter/flutter/assets/48603081/3b4d6f8c-7fdd-4546-a6f0-00dd34cb5a96)
2023-06-12 14:52:06 +00:00
LongCatIsLooong
e1fdb1aa74
migrate Tooltip to use OverlayPortal (#127728)
https://github.com/flutter/flutter/issues/7151 isn't a problem with OverlayPortal so the test is removed.
Also removed some `mounted` checks since they're no longer needed.
2023-06-10 20:54:37 +00:00
ZhulanovAA
65e1cb1988
Remove unnecessary parentheses (#128620)
Fix unnecessary parentheses introduced in #128501

@chunhtai @HansMuller
2023-06-10 18:02:14 +00:00
Andrew Kolos
cfe4fedca2
rename generated asset manifest file back to AssetManifest.bin (from AssetManifest.smcbin) (#128529)
Closes https://github.com/flutter/flutter/issues/128456, which is now linked to in a code comment in this change.
Reopens https://github.com/flutter/flutter/issues/124883.

This effectively reverts https://github.com/flutter/flutter/pull/126077 and is intended to be cherry-picked into stable.
2023-06-09 21:20:50 +00:00
hangyu
af7a8f6bd9
Add Selected semantics to IconButton (#128547)
fixes: #127145

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/wiki/Tree-hygiene#overview
[Tree Hygiene]: https://github.com/flutter/flutter/wiki/Tree-hygiene
[test-exempt]:
https://github.com/flutter/flutter/wiki/Tree-hygiene#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes
[Discord]: https://github.com/flutter/flutter/wiki/Chat

---------

Co-authored-by: Qun Cheng <36861262+QuncCccccc@users.noreply.github.com>
2023-06-09 14:16:50 -07:00
chunhtai
cc6f86e6e1
Clarifies semantics long press and semantics on tap documentation (#128599)
fixes https://github.com/flutter/flutter/issues/35112
2023-06-09 19:49:02 +00:00
Hans Muller
d5a8fa6271
Revert "Update chip.dart to use set of MaterialState" (#128607)
Reverts flutter/flutter#128507

This PR caused some internal failures (Google internal link b/286503764). Will need to investigate before we can re-land these changes.
2023-06-09 18:52:14 +00:00
ZhulanovAA
e84fa2ce47
Add tooltips for SegmentedButton (#128501) 2023-06-09 11:06:21 -07:00
Devin
5047690b53
ExpansionPanel isExpanded callback parameter (Ticket 74114) (#128082)
Fixes https://github.com/flutter/flutter/issues/74114

This PR addresses the issue detailed here: https://github.com/flutter/flutter/issues/74114 . The boolean isExpanded returned by the expansion panel callback now reflects the state of the panel that the user is seeing. If it's expanded on screen then the callback returns true. When you close the panel the callback returns false. When another panel is open and you open a different one, the callback executes twice. It returns isExpanded == false for the panel you are closing and true for the panel that is being opened.
I had to change the code in a couple existing tests because some tests are using the old behavior of the callback. This PR addresses feedback listed in closed PR -> https://github.com/flutter/flutter/pull/127876 . The reasone the original PR is closed is that I was having some struggles with git. A couple of the commits in this PR are just reverts of commits I meant not to happen.
Pre-launch Checklist

    [ X] I read the [Contributor Guide](https://github.com/flutter/flutter/wiki/Tree-hygiene#overview) and followed the process outlined there for submitting PRs.
    [ X] I read the [Tree Hygiene](https://github.com/flutter/flutter/wiki/Tree-hygiene) wiki page, which explains my responsibilities.
    [ X] I read and followed the [Flutter Style Guide](https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo), including [Features we expect every widget to implement](https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#features-we-expect-every-widget-to-implement).
    [ X] I signed the [CLA](https://cla.developers.google.com/).
    [ X] I listed at least one issue that this PR fixes in the description above.
    I updated/added relevant documentation (doc comments with ///).
    [ X] I added new tests to check the change I am making, or this PR is [test-exempt](https://github.com/flutter/flutter/wiki/Tree-hygiene#tests).
    [ X] All existing and new tests are passing.
2023-06-09 17:47:59 +00:00
hangyu
63f4174638
Paint SelectableFragments before text (#128375)
fixes: #104703
2023-06-09 17:00:14 +00:00
Hans Muller
da127f15ad
Updated material button theme tests for Material3 (#128543) 2023-06-09 06:57:21 -07:00
Pierre-Louis
66cda5917d
Improve defaults generation with logging, stats, and token validation (#128244)
## Description

This improves defaults generation with logging, stats, and token validation. 

This PR includes these changes:
* introduce `TokenLogger`, with a verbose mode
  * prints versions and tokens usage to the console
  * outputs `generated/used_tokens.csv`, a list of all used tokens, for use by Google
* find token files in `data` automatically
* hide tokens `Map`
  * tokens can be obtained using existing resolvers (e.g. `color`, `shape`), or directly through `getToken`.
  * tokens can be checked for existence with `tokenAvailable`
* remove version from template, since the tokens are aggregated and multiple versions are possible (as is the case currently), it does not make sense to attribute a single version
* improve documentation

## Related Issues
 - Fixes https://github.com/flutter/flutter/issues/122602

## Tests
 - Added tests for `TokenLogger`
 - Regenerated tokens, no-op except version removal

## Future work
A future PR should replace or remove the following invalid tokens usages

<img width="578" alt="image" src="https://github.com/flutter/flutter/assets/6655696/b6f9e5a7-523f-4f72-94f9-1b0bf4cc9f00">
2023-06-09 11:28:18 +00:00
Taha Tesser
8600eb129c
Fix showBottomSheet doesn't remove scrim when draggable sheet is dismissed (#128455)
fixes https://github.com/flutter/flutter/issues/128367

<details> 
<summary>code sample</summary> 

```dart
import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(useMaterial3: true),
      home: Scaffold(
        floatingActionButton: Builder(
          builder: (BuildContext context) => FloatingActionButton(
            child: const Icon(Icons.add),
            onPressed: () {
              Scaffold.of(context).showBottomSheet<void>(
                (_) {
                  return DraggableScrollableSheet(
                    expand: false,
                    builder: (_, ScrollController scrollController) =>
                        ListView.builder(
                      controller: scrollController,
                      itemCount: 25,
                      itemBuilder: (BuildContext context, int index) {
                        return ListTile(
                          title: Text('Item $index - tap to close'),
                          onTap: () {
                            Navigator.of(context).pop();
                          },
                        );
                      },
                    ),
                  );
                },
              );
            },
          ),
        ),
      ),
    );
  }
}
``` 
	
</details>

### Before

https://github.com/flutter/flutter/assets/48603081/fa87feb9-54f2-4e50-bf71-c81d9e54ff61

### After 

https://github.com/flutter/flutter/assets/48603081/7d192059-7600-4d65-ae84-6321f3598133
2023-06-09 07:06:49 +00:00
Tong Mu
ab3c5bfc7b
Remove single view assumption from MouseTracker, and unify its hit testing code flow (#127060)
This is a refactor to make `MouseTracker` use the same callback for both kinds of device update. Instead of using two different callbacks for the two device updating methods, `MouseTracker` now receives a hit testing callback at construction, which is the same hit testing method as the one used for other gestures.

This PR not only makes the code cleaner, but also removes the single view assumption from `MouseTracker`, whose code no longer refers to `RendererBinding.renderView`. In the future, we only need to modify `hitTest` (which we will have to do to support gestures for multi-view anyway) to make mouse tracker support multi-view.
2023-06-09 01:51:26 +00:00
Leigha Jarett
574a71817e
Adding migration guide for Material 3 colors (#128429)
Fixes: https://github.com/flutter/flutter/issues/127228
2023-06-08 23:00:41 +00:00
Greg Spencer
a280346193
Add AppLifecycleListener, with support for application exit handling (#123274)
## Description

This adds `AppLifecycleListener`, a class for listening to changes in the application lifecycle, and responding to requests to exit the application.

It depends on changes in the Engine that add new lifecycle states: https://github.com/flutter/engine/pull/42418

Here's a diagram for the lifecycle states. I'll add a similar diagram to the documentation for these classes.

![Application Lifecycle Diagram](https://github.com/flutter/flutter/assets/8867023/f6937002-cb93-4ab9-a221-25de2c45cf0e)

## Related Issues
 - https://github.com/flutter/flutter/issues/30735

## Tests
- Added tests for new lifecycle value, as well as for the `AppLifecycleListener` itself.
2023-06-08 22:57:19 +00:00
Tae Hyung Kim
f2351f61d4
Sliver Main Axis Group (#126596)
This widget implements the ability to place slivers one after another in
a single ScrollView in a way that all child slivers are drawn within the
bounds of the group itself (i.e. SliverPersistentHeaders aren't drawn
outside of the scroll extent provided by all of the child slivers). The
design document for SliverMainAxisGroup can be found
[here](https://docs.google.com/document/d/1e2bdLSYV_Dq2h8aHpF8mda67aOmZocPiMyjCcTTZhTg/edit?resourcekey=0-Xj2X2XA3CAFae22Sv3hAiA).

Fixes https://github.com/flutter/flutter/issues/33137.

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/wiki/Tree-hygiene#overview
[Tree Hygiene]: https://github.com/flutter/flutter/wiki/Tree-hygiene
[test-exempt]:
https://github.com/flutter/flutter/wiki/Tree-hygiene#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes
[Discord]: https://github.com/flutter/flutter/wiki/Chat

---------

Co-authored-by: Kate Lovett <katelovett@google.com>
2023-06-08 15:54:09 -07:00