3034 Commits

Author SHA1 Message Date
Renzo Olivares
21ad7122a1
Implement SelectionArea single click/tap gestures (#132682)
This change collapses the selection at the clicked/tapped location on single click down for desktop platforms, and on single click/tap up for mobile platforms to match native.

This is a change from how `SelectionArea` previously worked. Before this change a single click down would clear the selection. From observing a native browser it looks like when tapping on static text the selection is not cleared but collapsed. A user can still attain the selection from static text using the `window.getSelection` API.

https://jsfiddle.net/juepasn3/11/ You can try this demo out here to observe this behavior yourself. When clicking on static text the selection will change.

This change also allows `Paragraph.selections` to return selections that are collapsed. This for testing purposes to confirm where the selection has been collapsed.

Partially fixes: #129583
2023-09-28 01:42:16 +00:00
Kate Lovett
80fb7bd206
Support ensureVisible/showOnScreen/showInViewport for 2D Scrolling (#135182) 2023-09-27 16:57:24 -05:00
Kate Lovett
67d4a83116
Allow multiple ParentDataWidgets to write to ParentData (#133581)
Fixes https://github.com/flutter/flutter/issues/133089

This allows more than one ParentDataWidget to write to the ParentData of a child render object. Previously only one was allowed. There are some rules though:
1. Only one of a given type of `ParentDataWidget` can write to the `ParentData` of a given child.
  a. For example, 2 `Positioned` widgets wrapping a child of a `Stack` would not be allowed, as only one of type `Positioned` can contribute data.

2. The type of `ParentData` **must** be compatible with all of the `ParentDataWidget`s that want to contribute data.
  a. For example, `TwoDimensionalViewportParentData` mixes in the `KeepAliveParentDataMixin`. So the `ParentData` of a given child would be compatible with the `KeepAlive` `ParentDataWidget`, as well as another `ParentDataWidget` that writes `TwoDimensionalViewportParentData` (or a subclass of `TwoDimensionalViewportParentData` - This was the motivation for this change, where a `ParentDataWidget` is being used in `TableView` with the parent data type being a subclass of `TwoDimensionalViewportParentData`.)
2023-09-26 22:38:18 +00:00
Renzo Olivares
d81c8aa88b
SelectionArea long press selection overlay behavior should match native (#133967)
During a long press, on native iOS the context menu does not show until the long press has ended. The handles are shown immediately when the long press begins. This is true for static and editable text.

For static text on Android, the context menu appears when the long press is initiated, but the handles do not appear until the long press has ended. For editable text on Android, the context menu does not appear until the long press ended, and the handles also do not appear until the end.

For both platforms in editable/static contexts the context menu does not show while doing a long press drag.

I think the behavior where the context menu is not shown until the long press ends makes the most sense even though Android varies in this depending on the context. The user is not able to react to the context menu until the long press has ended.

Other details:
On a windows touch screen device the context menu does not show up until the long press ends in editable/static text contexts. On a long press hold it selects the word on drag start as well as popping up the selection handles (static text).
2023-09-26 22:06:15 +00:00
Edgar Jan
79caa8373c
Fix and Test Conditional Validator Behavior in FormField (#132714)
In the FormField widget, if a validator is initially set (and validation fails), then subsequently the validator is set to null, the form incorrectly retains its error state. This is not expected behavior as removing the validator should clear any validation errors.
2023-09-25 19:17:07 +00:00
Polina Cherkasova
49f1a6bb96
Fix failing test at master. (#135394) 2023-09-24 18:20:02 -07:00
Polina Cherkasova
49e16867a3
TabController should dispatch creation in constructor. (#133952) 2023-09-22 15:27:05 -07:00
Kostia Sokolovskyi
9d42ad84ee
Fix memory leak in NestedScrollViewState. (#135248) 2023-09-21 18:20:23 -07:00
Kostia Sokolovskyi
ffecedbca4
Cover more test/widgets tests with leak tracking #11 (#135231) 2023-09-21 16:30:32 -07:00
Polina Cherkasova
77718845dd
Handle breaking changes in leak_tracker. (#135185) 2023-09-21 10:06:21 -07:00
Kostia Sokolovskyi
04854e8aff
Fix memory leak in _SelectableTextState (#135049) 2023-09-20 16:43:44 -07:00
Kostia Sokolovskyi
e6d160a5c7
Cover more test/widgets tests with leak tracking #7 (#134943) 2023-09-20 13:27:29 -07:00
Michael Goderbauer
b0a90aee17
Enable strict-inference (#135043)
Avoids that dynamic accidentally sneaks in, see https://dart.dev/tools/analysis#enabling-additional-type-checks
2023-09-20 19:59:08 +00:00
Kostia Sokolovskyi
96a4ae9dc5
Cover more test/widgets tests with leak tracking #10 (#135143) 2023-09-20 12:29:33 -07:00
Kostia Sokolovskyi
98ebab58ee
Cover more test/widgets tests with leak tracking #8 (#135045) 2023-09-20 07:34:41 -07:00
Kostia Sokolovskyi
c3db020993
Cover more test/widgets tests with leak tracking #9 (#135054) 2023-09-20 07:34:23 -07:00
Polina Cherkasova
ab66f55728
Reland Resolve breaking change of adding a method to ChangeNotifier. (#134983) 2023-09-18 20:31:54 -07:00
Zachary Anderson
a9183f696c
Revert "Resolve breaking change of adding a method to ChangeNotifier." (#134978)
Reverts flutter/flutter#134953

Several failures on CI
2023-09-18 23:04:06 +00:00
Polina Cherkasova
5c6ef59b90
Resolve breaking change of adding a method to ChangeNotifier. (#134953) 2023-09-18 15:33:06 -07:00
chunhtai
f2050e8a10
Fixes focus traversal crash if the current node can't request focus (#134954)
fixes https://github.com/flutter/flutter/issues/134854

## Pre-launch Checklist

- [ ] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [ ] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [ ] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [ ] I signed the [CLA].
- [ ] I listed at least one issue that this PR fixes in the description
above.
- [ ] 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].
- [ ] 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
2023-09-18 15:17:52 -07:00
Michael Goderbauer
da0f9a997a
Enable private field promotion for framework (#134473)
New feature in upcoming Dart 3.2. See https://github.com/dart-lang/language/issues/2020. Feature is enabled by bumping the min SDK version to 3.2.

Part of https://github.com/flutter/flutter/issues/134476.
2023-09-18 20:51:09 +00:00
Kostia Sokolovskyi
2396a417e3
Cover more test/widgets tests with leak tracking #6 (#134884) 2023-09-18 13:46:29 -07:00
Polina Cherkasova
658710b6f9
Cover more tests with leak tracking. (#134805) 2023-09-18 13:45:38 -07:00
Kostia Sokolovskyi
56cbf3e1d9
Cover more test/widgets tests with leak tracking #5 (#134869) 2023-09-18 13:44:55 -07:00
Xilai Zhang
6425a3b431
[flutter roll] Revert "LinkedText (Linkify)" (#134955)
Reverts flutter/flutter#125927

context: b/300804374

Looks like a g3 fix might involve changing the names of widget on the customer app, and I am not sure if that would be the right approach forward. Putting up a revert to be safe for now.
2023-09-18 19:49:10 +00:00
Kostia Sokolovskyi
9dd3e1e6fc
Fix memory leak in _DarwinViewState. (#134938) 2023-09-18 11:39:01 -07:00
Kostia Sokolovskyi
09acfe6341
Fix memory leak in ListWheelScrollView (#134732) 2023-09-14 20:52:22 -07:00
chunhtai
0e521942a3
Allows page removal that contains Localhistoryentry (#134757)
fixes https://github.com/flutter/flutter/issues/97836
fixes https://github.com/flutter/flutter/issues/134752
fixes https://github.com/flutter/flutter/issues/118645
2023-09-14 21:00:55 +00:00
Kostia Sokolovskyi
ff10c52ad6
Cover more test/widgets tests with leak tracking #3 (#134576) 2023-09-14 12:26:41 -07:00
Justin McCandless
4db47db177
LinkedText (Linkify) (#125927)
New LinkedText widget and TextLinker class for easily adding hyperlinks to text.
2023-09-13 20:39:58 -07:00
Kate Lovett
2ea9edc1ad
Update KeepAlive.debugTypicalAncestorWidgetClass (#133498) 2023-09-13 18:16:14 -05:00
Delwin Mathew
b4953c3769
Fix null check crash by ReorderableList (#132153)
Fix issue where if you drag the last element of `ReorderableList` and put it in the same index, a `Null check` error arises. This happens as index in `_items` is out of bounds (when `reverse: true`). Fix is to check if last element, dragged element and drop index is same, and return as nothing has changed. Find this video attached.

https://github.com/flutter/flutter/assets/84124091/8043cac3-eb08-42e1-87e7-8095ecab09dc

Fixes issue #132077
2023-09-13 22:55:05 +00:00
Kostia Sokolovskyi
7cd8b4074f
Cover more test/widgets tests with leak tracking #4 (#134663) 2023-09-13 09:54:19 -07:00
Kostia Sokolovskyi
7d0c9b7211
Cover more test/widgets tests with leak tracking (#134387) 2023-09-12 17:43:34 -07:00
LongCatIsLooong
dc8377b1d4
Ensure OverlayPortal.overlayChild's renderObject is reachable via treewalk (#134497)
Fixes https://github.com/flutter/flutter/issues/133545

` child._layoutSurrogate.markNeedsLayout();` was called when `_skipMarkNeedsLayout` is set true so when there's no relayout boundary between the layout surrogate and the RenderTheater, no dirty render objects will be added to the PipelineOwner's dirty list.

It's ok to mark the RenderTheater dirty when there's no layout boundary between it and the layout surrogate.
2023-09-12 22:41:45 +00:00
Kate Lovett
90ae98f576
Remove deprecated TextSelectionOverlay.fadeDuration (#134485)
Part of https://github.com/flutter/flutter/issues/133171

This was deprecated in https://github.com/flutter/flutter/pull/100381
Th replacement is to use `SelectionOverlay.fadeDuration` instead.
This migration is supported by dart fix. âœ
2023-09-12 17:14:18 +00:00
chunhtai
5900c4baa7
Revert "Adds a parent scope TraversalEdgeBehavior and fixes modal rou… (#134550)
…te to no… (#130841)"

This reverts commit 0f3bd90d9b108904cc0390e899c2b3c6ee2e76e0.

Internal test needs migration

## Pre-launch Checklist

- [ ] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [ ] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [ ] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [ ] I signed the [CLA].
- [ ] I listed at least one issue that this PR fixes in the description
above.
- [ ] 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].
- [ ] 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
2023-09-12 09:18:40 -07:00
xubaolin
a9fac73361
[New feature] Allowing the ListView slivers to have different extents while still having scrolling performance (#131393)
Fixes https://github.com/flutter/flutter/issues/113431

Currently we only support specifying all slivers to have the same extent.
This patch introduces an `itemExtentBuilder` property for `ListView`, allowing the slivers to have different extents while still having scrolling performance, especially when the scroll position changes drastically(such as scrolling by the scrollbar or controller.jumpTo()).

@Piinks Hi, Any thoughts about this?  :)
2023-09-12 02:16:48 +00:00
Kostia Sokolovskyi
adaf78a60d
Cover focus tests with leak tracking (#134457) 2023-09-11 15:35:09 -07:00
Kostia Sokolovskyi
e7058f568f
Fix memory leak in RenderAnimatedSize (#133653)
`AnimationController` and `CurvedAnimation` objects were not disposed in `RenderAnimatedSize`.

### Description
- Fixes https://github.com/flutter/flutter/issues/133903;
- Adds the missing `dispose()` calls for `AnimationController` and `CurvedAnimation` in `RenderAnimatedSize`.

### Tests
- Updates `animated_size_test.dart` to test that `AnimationController` and `CurvedAnimation` are disposed after `RenderSize` disposal.
2023-09-11 20:46:04 +00:00
Renzo Olivares
2c477b1812
SelectableRegion onSelectionChange should be called when the selection changes (#134215)
This change makes sure to call `onSelectionChange` in all cases when selection might change including:
* Dragging selection handles
* Mouse drag to select
* Keyboard actions
* Long press drag to select
2023-09-09 22:03:23 +00:00
Kostia Sokolovskyi
5d5da38810
Fix memory leak in _DraggableScrollableSheetState (#134212) 2023-09-08 15:06:26 -07:00
Kostia Sokolovskyi
aca91df6b7
Cover some test/widgets tests with leak tracking (#133803) 2023-09-07 11:24:29 -07:00
Polina Cherkasova
248645a2b2
RestorableProperty should dispatch creation in constructor. (#133883) 2023-09-01 17:59:25 -07:00
Polina Cherkasova
a3362a9ff8
MaterialStatesController should dispatch creation in constructor. (#133826)
This PR also updates other tests to use matcher.
2023-09-01 17:29:47 -07:00
chunhtai
0f3bd90d9b
Adds a parent scope TraversalEdgeBehavior and fixes modal route to no… (#130841)
…t trap the focus

fixes https://github.com/flutter/flutter/issues/112567

Several things I done:

1. add new enum `parentScope`
2. refactor _sortAllDescendants so that it doesn't recursively looking
into its descendant when it encounter a FocusScopeNode.
3. When the nextFocus try to focus into a FocusScopeNode, it will try to
find the first focusable FocusNode in traversal order and focus it
instead if it doesn't have a first focus.
4. Change the default in Navigator to always be `parentScope`
5. Only the root navigator will use `leaveFlutterView` if platform is
web.


Previously 2 and 3 are not needed because once a focusscope trapped the
focus, there isn't a chance where the parent focusscope have to deal
with next focus.

If we don't do 2 and 3 after the change, it will cause it to stuck in
the current scope again. Because once the focus leave the current scope,
it needs to also remove the first focus in that scope (so that it can
start fresh when focus traversal back to the scope in the future). At
this point the current scope will have the primary focus without the
first focus. The parent scope will then try to find the next focus, and
it will place the focus to the first traversal child in the current
scope again.

## Pre-launch Checklist

- [ ] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [ ] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [ ] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [ ] I signed the [CLA].
- [ ] I listed at least one issue that this PR fixes in the description
above.
- [ ] 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].
- [ ] 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
2023-09-01 08:37:38 -07:00
Kate Lovett
cf051e7db2
Fix clipBehavior ignored in Scrollable of SingleChildScrollView (#133696)
Fixes https://github.com/flutter/flutter/issues/133330

The clipBehavior was not passed to the underlying Scrollable, which informs things like the clip on the StretchingOverscrollIndicator.
2023-08-31 23:50:39 +00:00
Polina Cherkasova
956999a4b9
Make Route dispatching memory events. (#133721) 2023-08-31 16:23:44 -07:00
yaakovschectman
e6e44de33c
Add MacOS AppKitView class. (#132583)
Add derived classes from the Darwin platform view base classes for
MacOS. Functionality is largely the same as the `UiKitView`, but the two
are decoupled and and can further diverge in the future as needed. Some
unit tests remain skipped for now as the gesture recognizers for MacOS
are not yet implemented.

https://github.com/flutter/flutter/issues/128519

## 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].
- [ ] 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: Chris Bracken <chris@bracken.jp>
2023-08-31 17:48:12 -04:00
Taha Tesser
f32b6fed24
Fix cursorColor with an opacity is not respected (#133548)
fixes [`cursorColor` with an opacity  is not respected](https://github.com/flutter/flutter/issues/132886)

<details>
<summary>expand to view the code sample</summary> 

```dart
import "package:flutter/material.dart";
// import "package:flutter/scheduler.dart";

// final color = Colors.red;
const color = Color(0x55ff0000);

void main() {
  // timeDilation = 4;
  runApp(const MyApp());
}

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

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

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

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

class _ExampleState extends State<Example> {
  late FocusNode _focusNode;
  late TextEditingController _controller;

  @override
  void initState() {
    super.initState();
    _focusNode = FocusNode();
    _controller = TextEditingController(text: 'Hello World');
  }

  @override
  void dispose() {
    _focusNode.dispose();
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    const bool cursorOpacityAnimates = false;
    double cursorWidth = 6;

    return Scaffold(

      body: Center(
        child: Padding(
          padding: const EdgeInsets.symmetric(
            horizontal: 16,
          ),
          child: Column(
            children: <Widget>[
              const Spacer(),
              const Text('EditableText'),
              const SizedBox(height: 8),
              InputDecorator(
                decoration: InputDecoration(
                  border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(8),
                  ),
                ),
                child: EditableText(
                  cursorColor: color,
                  cursorWidth: cursorWidth,
                  cursorOpacityAnimates: cursorOpacityAnimates,
                  focusNode: _focusNode,
                  controller: _controller,
                  style: Theme.of(context).textTheme.bodyLarge!,
                  backgroundCursorColor: Colors.amber,
                  onSubmitted: (String value) {
                    // Add your code here.
                  },
                ),
              ),
              const Spacer(),
              const Text('TextField'),
              const SizedBox(height: 8),
              TextField(
                cursorColor: color,
                cursorWidth: cursorWidth,
                cursorOpacityAnimates: cursorOpacityAnimates,
                controller: _controller,
                focusNode: _focusNode,
                onSubmitted: (String value) {
                  // Add your code here.
                },
              ),
              const Spacer(),
            ],
          ),
        ),
      ),
    );
  }
}
```

</details>

### Before

![Screenshot 2023-08-29 at 14 57 57](https://github.com/flutter/flutter/assets/48603081/cd55bb74-23b8-4980-915d-f13dee22a50f)

### After
![Screenshot 2023-08-29 at 14 58 20](https://github.com/flutter/flutter/assets/48603081/c94af4e3-f24b-44e7-bbed-7c6c21e90f2a)
2023-08-31 19:49:06 +00:00