1. 15 Sep, 2020 1 commit
    • Alexandre Ardhuin's avatar
      Reland "Nnbd widgets" (#65528) · b007a81a
      Alexandre Ardhuin authored
      * Reland "Nnbd widgets (#64672)"
      
      This reverts commit 127e6790.
      
      * remove non-nullable enforcement on AsyncSnapshot
      
      * make data param non-nullable for AsyncSnapshot.withData
      
      * make some Text params non-nullable
      b007a81a
  2. 09 Sep, 2020 2 commits
    • Michael Goderbauer's avatar
      Revert "Nnbd widgets (#64672)" (#65488) · 127e6790
      Michael Goderbauer authored
      This reverts commit e682ec71.
      127e6790
    • Alexandre Ardhuin's avatar
      Nnbd widgets (#64672) · e682ec71
      Alexandre Ardhuin authored
      * migrate widget to nullsafety
      
      * remove double blank line after license
      
      * address review comments in actions.dart
      
      * nullable ObjectKey.value
      
      * use local variable oldElement
      
      * make State.build non-nullable
      
      * make State.context non-nullable
      
      * newline at eof
      
      * make ProxyWidget.child non-nullable
      
      * make _InactiveElements.debugContains non-nullable
      
      * make Element.depth non-nullable
      
      * make ProxyElement.build non-nullable
      
      * make StatefulElement.state non-nullable
      
      * remove 'Notice that'
      
      * avoid cast of list in RenderObjectElement.updateChildren
      
      * make IndexedSlot.value non-nullable
      
      * avoid cast of list in MultiChildRenderObjectElement.mount
      
      * make some WidgetsApp parameters non-nullable
      
      * hitTest take non-nullable position
      
      * make ScrollableState.position non-nullable
      
      * use _pixels instead of pixels
      
      * make ViewportOffset.pixels non-nullable
      
      * make param and return type of IndexedWidgetBuilder non-nullable
      
      * unused_import
      
      * make context param non-nullable for Builder in animated_list.dart
      
      * make ScrollMetrics.viewportDimension non-nullable
      
      * make ScrollMetrics.{min,max}ScrollExtent non-nullable
      
      * make _Location.file non-nullable
      
      * _WidgetForTypeTests.createElement throw UnimplementedError
      
      * update _NullWidget.build error message
      
      * make _ShortcutsState.manager non-nullable
      
      * Fix childCount issues for NNBD
      
      * fix childCount computation on web
      
      * increase max value on js side to compute childCount
      
      * make aspect parameter of dependOnInheritedWidgetOfExactType nullable
      
      * merge has{min,max}ScrollExtent into hasScrollExtents
      
      * update focus_manager.dart
      
      * address review comments in icon.dart
      
      * address review comments in image.dart
      
      * address review comments in routes.dart
      
      * address review comments in scroll_activity.dart
      
      * update doc comments
      
      * make UserScrollNotification.direction non-nullable and required
      
      * rename hasScrollExtents to hasContentDimensions
      
      * unnecessary late
      Co-authored-by: 's avatarIan Hickson <ian@hixie.ch>
      e682ec71
  3. 30 Jul, 2020 1 commit
  4. 29 Jul, 2020 2 commits
  5. 28 Jul, 2020 1 commit
  6. 11 Jun, 2020 1 commit
  7. 10 Jun, 2020 1 commit
  8. 08 May, 2020 2 commits
  9. 01 May, 2020 1 commit
    • Greg Spencer's avatar
      Add `ExcludeFocus` widget, and a way to prevent focusability for a subtree. (#55756) · fdc4d21b
      Greg Spencer authored
      This adds an ExcludeFocus widget that prevents widgets in a subtree from having or obtaining focus. It also adds the ability for a FocusNode to conditionally prevent its children from being focusable when it isn't focusable (i.e. when canRequestFocus is false).
      
      It does this by adding an descendantsAreFocusable attribute to the FocusNode, which, when false, prevents the descendants of the node from being focusable (and removes focus from them if they are currently focused).
      fdc4d21b
  10. 03 Mar, 2020 1 commit
  11. 23 Feb, 2020 1 commit
  12. 20 Feb, 2020 1 commit
  13. 13 Feb, 2020 1 commit
    • Greg Spencer's avatar
      Reland: Add OrderedFocusTraversalPolicy and FocusTraversalGrou… (#50672) · d57d4935
      Greg Spencer authored
      This re-lands #49235 with the addition of includeSemantics flag on the Focus widget so that the FocusTraversalGroup can create a Focus widget without affecting the semantics tree.
      
      The FocusTraversalGroup uses the Focus widget to create a grouping of descendants for traversal, but doesn't actually participate in focus (canRequestFocus is always false), so we don't want it to add a Semantics widget in that case, since that can cause semantics changes. The canRequestFocus attribute can also be used when a widget is disabled, so we do sometimes want to include Semantics even if that is false, but not in the case where it is always false, as for FocusTraversalGroup.
      
      - Added a test to make sure that FocusTraversalGroup doesn't add any semantics information.
      d57d4935
  14. 12 Feb, 2020 1 commit
  15. 11 Feb, 2020 1 commit
    • Greg Spencer's avatar
      Add OrderedFocusTraversalPolicy and FocusTraversalGroup to all… (#49235) · 8ef5e2f0
      Greg Spencer authored
      This change adds a way to provide explicit focus order for a part of the widget tree.
      
      It adds FocusTraversalPolicyGroup, which in many ways is similar to DefaultFocusTraversal, except that it groups a widget subtree together so that those nodes are traversed as a group. DefaultFocusTraversal doesn't work as one would expect: If there is more than one DefaultFocusTraversal inside of a focus scope, the policy can change depending on which node was asked to move "next", which can cause unexpected behavior. The new grouping mechanism doesn't have that problem. I deprecate DefaultFocusTraversal in this PR.
      
      It also adds OrderedFocusTraversalPolicy, which is a policy that can be supplied to FocusTraversalPolicyGroup to set the policy for a sub-tree. It looks for FocusTraversalOrder inherited widgets, which use a FocusOrder to do the sorting. FocusOrder has two subclasses: NumericalFocusOrder (which sorts based on a double), and LexicalFocusOrder, which sorts based on a String.
      
      As part of doing this, I refactored the way FocusTraversalPolicy is implemented so that it has more default implementation methods, and exposes a new protected member: sortDescendants, which makes it easier for developers to make their own policy subclasses: they only need to implement sortDescendants to get a new ordering behavior, but can also still override any of the default implementation behaviors if they need different behavior.
      
      I was able to do this without breaking the API (AFAICT).
      8ef5e2f0
  16. 10 Feb, 2020 1 commit
    • Greg Spencer's avatar
      Update samples to work with Dartpad, and convert all that make… (#50377) · 9fb781a5
      Greg Spencer authored
      This PR modifies the existing API docs samples to use DartPad so that all of the samples are now interactive apps on the API docs site.
      
      It also removes the restriction for the max width of the description area so that the dartpad region can expand horizontally.
      
      I updated the first paragraph on the API docs to indicate that Flutter is more than just mobile now (same text as the README.md at the top level).
      
      I modified a few of the examples so that they looked nicer, and fit better on the page.
      
      I added the sample description text above each DartPad instance, since that often defines the context of the example.
      
      I removed animations and images when they were redundant with the sample content. There were a few that made sense to keep, so I did.
      9fb781a5
  17. 29 Jan, 2020 1 commit
  18. 25 Jan, 2020 1 commit
  19. 13 Jan, 2020 1 commit
    • Greg Spencer's avatar
      Allow requestFocus on an unattached FocusNode to create a deferred focus request (#48589) · 6495d377
      Greg Spencer authored
      This changes the behavior of requestFocus when it is called on a FocusNode that does not yet have a parent, so that it defers requesting focus until it receives a parent. Before this change, calling requestFocus before it had a parent was a no-op.
      
      This allows scenarios where a widget is newly added and wishes to immediately request the focus. Previously, it was very hard to make that work because requesting focus before the widget's focus node had a parent was ignored, so the developer had to wait until two frames later to request focus (one for the widget's node to be added to the focus tree, and one to request the focus).
      
      Now, in order to have a widget be focused when initially added, you just need to call requestFocus on its node when you create it, and as soon as it is added, it will automatically request focus.
      
      This is different from the autofocus attribute on the Focus widget, because it unconditionally requests focus when added (autofocus will only request focus if nothing else in the scope has focus).
      6495d377
  20. 08 Jan, 2020 1 commit
  21. 05 Dec, 2019 2 commits
    • Greg Spencer's avatar
      Fixes Focus and FocusScope's assignment of canRequestFocus. (#46168) · e3005e69
      Greg Spencer authored
      This fixes an issue where lines like this:
      
          focusNode.canRequestFocus = widget.canRequestFocus ?? focusNode.canRequestFocus;
      
      Were causing the canRequestFocus bit to copy the status of the enclosing scope, since canRequestFocus also looks to the enclosing scope to decide if it can focus.
      e3005e69
    • Greg Spencer's avatar
      Normalizes all of the "See also" blocks in comments. (#46121) · c6fe7bb9
      Greg Spencer authored
      This normalizes all of the "See also" blocks in comments so that they conform in style.
      
      They all look like this now:
      
        /// See also:
        ///
        ///  * [MyFavoriteWidget], because it's cool.
        class Foo {}
      
      I removed some useless "See also" blocks, and added commentary to ones that were just "bare" references.
      
      This is my penance for adding so many bullets that are "-" instead of "*". :-)
      c6fe7bb9
  22. 27 Nov, 2019 1 commit
    • Ian Hickson's avatar
      License update (#45373) · 449f4a66
      Ian Hickson authored
      * Update project.pbxproj files to say Flutter rather than Chromium
      
      Also, the templates now have an empty organization so that we don't cause people to give their apps a Flutter copyright.
      
      * Update the copyright notice checker to require a standard notice on all files
      
      * Update copyrights on Dart files. (This was a mechanical commit.)
      
      * Fix weird license headers on Dart files that deviate from our conventions; relicense Shrine.
      
      Some were already marked "The Flutter Authors", not clear why. Their
      dates have been normalized. Some were missing the blank line after the
      license. Some were randomly different in trivial ways for no apparent
      reason (e.g. missing the trailing period).
      
      * Clean up the copyrights in non-Dart files. (Manual edits.)
      
      Also, make sure templates don't have copyrights.
      
      * Fix some more ORGANIZATIONNAMEs
      449f4a66
  23. 22 Nov, 2019 1 commit
    • Alexandre Ardhuin's avatar
      make some BuildContext methods generics (#44189) · fcb40a05
      Alexandre Ardhuin authored
      * make BuildContext.{ancestorStateOfType,ancestorRenderObjectOfType,rootAncestorStateOfType} generic
      
      * make BuildContext.inheritFromWidgetOfExactType generic
      
      * make BuildContext.ancestorInheritedElementForWidgetOfExactType generic
      
      * make BuildContext.ancestorWidgetOfExactType generic
      
      * fix snippet
      
      * bump scoped_model on temp version
      
      * update names
      
      * Revert "bump scoped_model on temp version"
      
      This reverts commit d1fcbba028cdb07f44738d1652391692d1ea5ec0.
      
      * address review comments
      
      * fix ci
      
      * address review comments
      
      * repeat the deprecation notice
      
      * fix uppercase
      
      * use of recommanded deprecation syntax
      
      * address review comment
      fcb40a05
  24. 19 Nov, 2019 1 commit
    • Greg Spencer's avatar
      FocusableActionDetector widget (#44867) · 6e10719d
      Greg Spencer authored
      This adds a FocusableActionDetector, a widget which combines the functionality of Actions, Shortcuts, MouseRegion and a Focus widget to create a detector that defines actions and key bindings, and will notify that the focus or hover highlights should be shown or not. This widget can be used to give a control the required detection modes for focus and hover handling on desktop and web platforms.
      
      I replaced a bunch of similar code in many of our widgets with this widget, and found that pretty much any control that wants to be focusable wants all of these features as well: focus highlights, hover highlights, and actions to activate it.
      
      Also eliminated an extra _hasFocus variable in FocusState that wasn't being used.
      6e10719d
  25. 18 Oct, 2019 1 commit
    • Greg Spencer's avatar
      Wire up canRequestFocus and skipTraversal in FocusScopeNode (#43013) · 560873af
      Greg Spencer authored
      This adds a canRequestFocus and skipTraversal argument to FocusScope and FocusScopeNode, so that a scope can prevent being traversed.
      
      This allows a fix for a problem in the gallery where the focus while traversing the list of items would sometimes appear to disappear, since it would be focusing things that were in the backdrop that were part of the tree, but were not visible.
      
      Related Issues
      Fixes #42955
      560873af
  26. 15 Oct, 2019 1 commit
    • Greg Spencer's avatar
      Optimize focus operations by caching descendants and ancestors. (#42683) · 134ac429
      Greg Spencer authored
      This optimizes certain paths in the FocusManager, FocusNode, and FocusScopeNode classes in order to fix a regression in stock_animation_open_first_frame_average when I added more focus nodes to the tree to do focus traversal.
      
      Mainly I removed some remaining sync* iterators, and also started caching the computation of descendants and ancestors, since those are iterated over fairly often.
      
      This improves stock_animation_open_first_frame_average by about 2.8% overall (so about half of a 4.9% regression, both averaged over 10 runs).
      
      Addresses #42564
      134ac429
  27. 10 Oct, 2019 1 commit
    • Greg Spencer's avatar
      Re-land keyboard traversal PRs (#42278) · ce150971
      Greg Spencer authored
      This attempts to reland #40186 and #41220, that were reverted in #41945.
      
      The main modifications from the original PRs are that I predefine the shortcuts and actions maps instead of defining them inline in the build function, and I use a new mapEquals to do a deep comparison so that we don't rebuild modified things if the contents of the map haven't changed.
      
      I also eliminated an operator== and hashCode that were defined on the Actions widget, since widgets shouldn't have those. (it's too bad though: I get an 85% speedup if we leave this in! Too bad it prevents rebuilding of the children...)
      
      Fixes #40101
      ce150971
  28. 09 Oct, 2019 1 commit
    • Greg Spencer's avatar
      Enables setting of semantics focused and focusable attributes within Focus widgets. (#41814) · 89d6c8d9
      Greg Spencer authored
      This adds a Semantics node to the Focus and FocusScope widgets, setting the focused and focusable attributes so that the accessibility subsystem can be told when a control has the input focus.
      
      Includes an engine roll to flutter/engine@77252d2, and the following 8 engine changes:
      
      flutter/engine@77252d2 Greg Spencer Add missing focusable testing info (flutter/engine#13013)
      flutter/engine@0e42a29 skia-flutter-.. Roll src/third_party/skia 54548626a977..e27a503a0a21 (1 commits) (flutter/engine#13024)
      flutter/engine@6b56ed7 gaaclarke Refactor: FlutterDartProject (flutter/engine#13006)
      flutter/engine@393480c skia-flutter-.. Roll src/third_party/skia 77dde599c98a..54548626a977 (1 commits) (flutter/engine#13023)
      flutter/engine@080b89d skia-flutter-.. Roll src/third_party/skia 2b1a25a4d324..77dde599c98a (1 commits) (flutter/engine#13021)
      flutter/engine@90b0f30 Ben Konyi Roll src/third_party/dart f4a72bfc64..bb04f145b2 (18 commits) (flutter/engine#13020)
      flutter/engine@049fb89 skia-flutter-.. Roll fuchsia/sdk/core/linux-amd64 from q_uYX... to cknsi... (flutter/engine#13019)
      flutter/engine@6925b2a skia-flutter-.. Roll fuchsia/sdk/core/mac-amd64 from wuAtw... to u0JpE... (flutter/engine#13018)
      
      Related Issues
      Addresses #40101
      
      Landing on red in order to fix the build: it's red because of the needed engine roll.
      89d6c8d9
  29. 04 Oct, 2019 1 commit
  30. 02 Oct, 2019 1 commit
    • Greg Spencer's avatar
      Add an ActivateAction to controls that use InkWell. (#41220) · 4512a1c1
      Greg Spencer authored
      Adds an ActivateAction to controls that use InkWell. Make InkWell host the Focus for those controls, and add the top level binding to the ENTER key. This will make it possible to trigger a button using the enter key, and to get an ink response when the button is triggered.
      
      This is a breaking change because it moves the Focus widget into the InkWell. If you have a component that uses the InkWell directly and you used to wrap that InkWell in a Focus widget to give it its notion of focus, it will now not look for that Focus ancestor for its focus state anymore. In order to control focus on the InkWell, you need to give it a FocusNode directly, via the new focusNode parameter. This should not affect users of widgets like OutlineButton or FloatingActionButton and the like, since those have been modified in this PR.
      4512a1c1
  31. 26 Sep, 2019 1 commit
    • Greg Spencer's avatar
      Added proper focus handling when pushing and popping routes (#40166) · 1a7bb1f5
      Greg Spencer authored
      The proposed change will change focus handling when pushing and popping routes so that the FocusScopeNode for the route receives focus when pushed, and that the FocusScopeNode in the navigator receives focus when the route is popped.
      
      This means that the last setFirstFocus call on the scope is used to determine which control actually receives focus. When the focus scope receives focus, it traverses its children, trying to find a non-scope node that is the "first focus" of itself or a child node.
      
      This is a breaking change, because the focus behavior has changed. If you push a route after this change, and had a 'first focus' set on a widget via FocusScopeNode.setFirstFocus, it won't currently receive focus immediately, but after this change it will. Similarly, if you pop a route after this change, the focus will go back to where it was before the route was pushed, which is correct, but different from what happens now.
      1a7bb1f5
  32. 10 Sep, 2019 1 commit
  33. 16 Aug, 2019 1 commit
    • Greg Spencer's avatar
      Adds canRequestFocus toggle to FocusNode (#38704) · d6938c56
      Greg Spencer authored
      * Add an 'unfocusable' focus node to allow developers to indicate when they don't want a Focus widget to be active
      
      * more unfocusable changes. not working.
      
      * Switch to focusable attribute
      
      * Rename to canRequestFocus
      
      * Turn off debug output
      
      * Update docs
      
      * Removed unused import
      d6938c56
  34. 15 Aug, 2019 1 commit
  35. 16 May, 2019 1 commit
    • Greg Spencer's avatar
      Fix Focus.of to not find FocusScope nodes. (#32826) · 3c16cf6a
      Greg Spencer authored
      Until this change, Focus.of would return a FocusScopeNode if it found a FocusScope widget. This isn't really all that useful, and can easily lead to bad situations where many widgets think that the scope they are in (or the root scope!) is their indication of being focused.
      
      This changes Focus.of to throw an exception if it doesn't find a Focus widget before reaching the nearest FocusScope widget, or the root of the widget hierarchy.
      
      It also adds a nullOk optional bool to Focus.of so that if a caller expects to not find a Focus widget, it can deal with that as it sees fit. I modified InkWell to use this new behavior.
      
      This fixes an unreported issue that widgets using an InkWell will be drawn as focused the first time they are visited.
      3c16cf6a
  36. 15 May, 2019 1 commit
    • Greg Spencer's avatar
      Implements focus handling and hover for Material buttons. (#31438) · bb3c6605
      Greg Spencer authored
      This implements focus and hover handling for Material buttons. It inserts Focus widgets into the tree in order to allow buttons to be focusable via keyboard traversal (a.k.a. TAB traversal), and Listener widgets into the InkWell to allow the detection of hover states for widgets.
      
      Addresses #11344, #1608, and #13264.
      bb3c6605