From c28d3ba0f4485f9b84497b39fe34bc27885e35dc Mon Sep 17 00:00:00 2001 From: Renzo Olivares Date: Tue, 26 Nov 2024 13:34:14 -0800 Subject: [PATCH 1/9] Add selection toggle for simple table demo --- .../example/lib/table_view/simple_table.dart | 133 +++++++++++++----- 1 file changed, 99 insertions(+), 34 deletions(-) diff --git a/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart b/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart index 5e23bb20e95..fe08f6df38b 100644 --- a/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart +++ b/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart @@ -19,8 +19,15 @@ class TableExample extends StatefulWidget { State createState() => _TableExampleState(); } +enum _TableSelection { + multiCell, + singleCell, + disabled, +} + class _TableExampleState extends State { late final ScrollController _verticalController = ScrollController(); + _TableSelection _selectionMode = _TableSelection.disabled; int _rowCount = 20; @override @@ -34,49 +41,107 @@ class _TableExampleState extends State { return Scaffold( body: Padding( padding: const EdgeInsets.symmetric(horizontal: 50.0), - child: TableView.builder( - verticalDetails: ScrollableDetails.vertical( - controller: _verticalController, - ), - cellBuilder: _buildCell, - columnCount: 20, - columnBuilder: _buildColumnSpan, - rowCount: _rowCount, - rowBuilder: _buildRowSpan, - ), + child: _selectionMode == _TableSelection.multiCell + ? SelectionArea( + child: TableView.builder( + verticalDetails: ScrollableDetails.vertical( + controller: _verticalController, + ), + cellBuilder: _buildCell, + columnCount: 20, + columnBuilder: _buildColumnSpan, + rowCount: _rowCount, + rowBuilder: _buildRowSpan, + ), + ) + : TableView.builder( + verticalDetails: ScrollableDetails.vertical( + controller: _verticalController, + ), + cellBuilder: _buildCell, + columnCount: 20, + columnBuilder: _buildColumnSpan, + rowCount: _rowCount, + rowBuilder: _buildRowSpan, + ), ), persistentFooterButtons: [ - TextButton( - onPressed: () { - _verticalController.jumpTo(0); - }, - child: const Text('Jump to Top'), - ), - TextButton( - onPressed: () { - _verticalController.jumpTo( - _verticalController.position.maxScrollExtent, - ); - }, - child: const Text('Jump to Bottom'), - ), - TextButton( - onPressed: () { - setState(() { - _rowCount += 10; - }); - }, - child: const Text('Add 10 Rows'), + OverflowBar( + alignment: MainAxisAlignment.spaceEvenly, + children: [ + Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text('Selection'), + SegmentedButton<_TableSelection>( + segments: const >[ + ButtonSegment<_TableSelection>( + value: _TableSelection.multiCell, + label: Text('Multi-Cell'), + icon: Icon(Icons.layers)), + ButtonSegment<_TableSelection>( + value: _TableSelection.singleCell, + label: Text('Single-Cell'), + icon: Icon(Icons.crop_square)), + ButtonSegment<_TableSelection>( + value: _TableSelection.disabled, + label: Text('Disabled'), + icon: Icon(Icons.disabled_by_default)), + ], + selected: <_TableSelection>{_selectionMode}, + onSelectionChanged: (Set<_TableSelection> newSelection) { + setState(() { + // By default there is only a single segment that can be + // selected at one time, so its value is always the first + // item in the selected set. + _selectionMode = newSelection.first; + }); + }, + ), + ], + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + TextButton( + onPressed: () { + _verticalController.jumpTo(0); + }, + child: const Text('Jump to Top'), + ), + TextButton( + onPressed: () { + _verticalController.jumpTo( + _verticalController.position.maxScrollExtent, + ); + }, + child: const Text('Jump to Bottom'), + ), + TextButton( + onPressed: () { + setState(() { + _rowCount += 10; + }); + }, + child: const Text('Add 10 Rows'), + ), + ], + ), + ], ), ], ); } TableViewCell _buildCell(BuildContext context, TableVicinity vicinity) { + Widget result = Center( + child: Text('Tile c: ${vicinity.column}, r: ${vicinity.row}'), + ); + if (_selectionMode == _TableSelection.singleCell) { + result = SelectionArea(child: result); + } return TableViewCell( - child: Center( - child: Text('Tile c: ${vicinity.column}, r: ${vicinity.row}'), - ), + child: result, ); } From 2f69a19791c2377ca13219e584f698b1ae06d01d Mon Sep 17 00:00:00 2001 From: Renzo Olivares Date: Thu, 9 Jan 2025 12:06:24 -0800 Subject: [PATCH 2/9] analyzer fixes --- .../example/lib/table_view/simple_table.dart | 8 ++++---- .../test/table_view/simple_table_test.dart | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart b/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart index fe08f6df38b..2d1bf4bb1bc 100644 --- a/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart +++ b/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart @@ -68,11 +68,11 @@ class _TableExampleState extends State { persistentFooterButtons: [ OverflowBar( alignment: MainAxisAlignment.spaceEvenly, - children: [ + children: [ Column( mainAxisSize: MainAxisSize.min, - children: [ - Text('Selection'), + children: [ + const Text('Selection'), SegmentedButton<_TableSelection>( segments: const >[ ButtonSegment<_TableSelection>( @@ -102,7 +102,7 @@ class _TableExampleState extends State { ), Row( mainAxisSize: MainAxisSize.min, - children: [ + children: [ TextButton( onPressed: () { _verticalController.jumpTo(0); diff --git a/packages/two_dimensional_scrollables/example/test/table_view/simple_table_test.dart b/packages/two_dimensional_scrollables/example/test/table_view/simple_table_test.dart index 0186c4d68ba..3332d1b07a5 100644 --- a/packages/two_dimensional_scrollables/example/test/table_view/simple_table_test.dart +++ b/packages/two_dimensional_scrollables/example/test/table_view/simple_table_test.dart @@ -54,4 +54,21 @@ void main() { await tester.pump(); expect(position.pixels, 0.0); }); + + testWidgets('Selection SegmentedButton control works', (WidgetTester tester) async { + await tester.pumpWidget(const MaterialApp(home: TableExample())); + await tester.pump(); + + // Enable multi-cell selection and verify. + await tester.tap(find.textContaining('Multi-Cell')); + await tester.pump(); + + // Enable single-cell selection and verify. + await tester.tap(find.textContaining('Single-Cell')); + await tester.pump(); + + // Disable selection and verify. + await tester.tap(find.text('Disabled')); + await tester.pump(); + }); } From a1279964e8ee0d654a9be80051ce5c12e651e54c Mon Sep 17 00:00:00 2001 From: Renzo Olivares Date: Thu, 9 Jan 2025 12:07:54 -0800 Subject: [PATCH 3/9] dartfmt --- .../example/lib/table_view/simple_table.dart | 104 ++++++++---------- 1 file changed, 48 insertions(+), 56 deletions(-) diff --git a/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart b/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart index 2d1bf4bb1bc..652978e685a 100644 --- a/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart +++ b/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart @@ -19,11 +19,7 @@ class TableExample extends StatefulWidget { State createState() => _TableExampleState(); } -enum _TableSelection { - multiCell, - singleCell, - disabled, -} +enum _TableSelection { multiCell, singleCell, disabled } class _TableExampleState extends State { late final ScrollController _verticalController = ScrollController(); @@ -41,29 +37,30 @@ class _TableExampleState extends State { return Scaffold( body: Padding( padding: const EdgeInsets.symmetric(horizontal: 50.0), - child: _selectionMode == _TableSelection.multiCell - ? SelectionArea( - child: TableView.builder( - verticalDetails: ScrollableDetails.vertical( - controller: _verticalController, - ), - cellBuilder: _buildCell, - columnCount: 20, - columnBuilder: _buildColumnSpan, - rowCount: _rowCount, - rowBuilder: _buildRowSpan, - ), - ) - : TableView.builder( - verticalDetails: ScrollableDetails.vertical( - controller: _verticalController, - ), - cellBuilder: _buildCell, - columnCount: 20, - columnBuilder: _buildColumnSpan, - rowCount: _rowCount, - rowBuilder: _buildRowSpan, - ), + child: + _selectionMode == _TableSelection.multiCell + ? SelectionArea( + child: TableView.builder( + verticalDetails: ScrollableDetails.vertical( + controller: _verticalController, + ), + cellBuilder: _buildCell, + columnCount: 20, + columnBuilder: _buildColumnSpan, + rowCount: _rowCount, + rowBuilder: _buildRowSpan, + ), + ) + : TableView.builder( + verticalDetails: ScrollableDetails.vertical( + controller: _verticalController, + ), + cellBuilder: _buildCell, + columnCount: 20, + columnBuilder: _buildColumnSpan, + rowCount: _rowCount, + rowBuilder: _buildRowSpan, + ), ), persistentFooterButtons: [ OverflowBar( @@ -76,17 +73,20 @@ class _TableExampleState extends State { SegmentedButton<_TableSelection>( segments: const >[ ButtonSegment<_TableSelection>( - value: _TableSelection.multiCell, - label: Text('Multi-Cell'), - icon: Icon(Icons.layers)), + value: _TableSelection.multiCell, + label: Text('Multi-Cell'), + icon: Icon(Icons.layers), + ), ButtonSegment<_TableSelection>( - value: _TableSelection.singleCell, - label: Text('Single-Cell'), - icon: Icon(Icons.crop_square)), + value: _TableSelection.singleCell, + label: Text('Single-Cell'), + icon: Icon(Icons.crop_square), + ), ButtonSegment<_TableSelection>( - value: _TableSelection.disabled, - label: Text('Disabled'), - icon: Icon(Icons.disabled_by_default)), + value: _TableSelection.disabled, + label: Text('Disabled'), + icon: Icon(Icons.disabled_by_default), + ), ], selected: <_TableSelection>{_selectionMode}, onSelectionChanged: (Set<_TableSelection> newSelection) { @@ -140,16 +140,12 @@ class _TableExampleState extends State { if (_selectionMode == _TableSelection.singleCell) { result = SelectionArea(child: result); } - return TableViewCell( - child: result, - ); + return TableViewCell(child: result); } TableSpan _buildColumnSpan(int index) { const TableSpanDecoration decoration = TableSpanDecoration( - border: TableSpanBorder( - trailing: BorderSide(), - ), + border: TableSpanBorder(trailing: BorderSide()), ); switch (index % 5) { @@ -161,10 +157,10 @@ class _TableExampleState extends State { recognizerFactories: { TapGestureRecognizer: GestureRecognizerFactoryWithHandlers( - () => TapGestureRecognizer(), - (TapGestureRecognizer t) => - t.onTap = () => print('Tap column $index'), - ), + () => TapGestureRecognizer(), + (TapGestureRecognizer t) => + t.onTap = () => print('Tap column $index'), + ), }, ); case 1: @@ -202,11 +198,7 @@ class _TableExampleState extends State { TableSpan _buildRowSpan(int index) { final TableSpanDecoration decoration = TableSpanDecoration( color: index.isEven ? Colors.purple[100] : null, - border: const TableSpanBorder( - trailing: BorderSide( - width: 3, - ), - ), + border: const TableSpanBorder(trailing: BorderSide(width: 3)), ); switch (index % 3) { @@ -217,10 +209,10 @@ class _TableExampleState extends State { recognizerFactories: { TapGestureRecognizer: GestureRecognizerFactoryWithHandlers( - () => TapGestureRecognizer(), - (TapGestureRecognizer t) => - t.onTap = () => print('Tap row $index'), - ), + () => TapGestureRecognizer(), + (TapGestureRecognizer t) => + t.onTap = () => print('Tap row $index'), + ), }, ); case 1: From 637418c551db490352edc9632691fe965bf24957 Mon Sep 17 00:00:00 2001 From: Renzo Olivares Date: Thu, 9 Jan 2025 12:36:50 -0800 Subject: [PATCH 4/9] update changelog --- packages/two_dimensional_scrollables/CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/two_dimensional_scrollables/CHANGELOG.md b/packages/two_dimensional_scrollables/CHANGELOG.md index 62cdc53d1cd..9f9d3ac7aec 100644 --- a/packages/two_dimensional_scrollables/CHANGELOG.md +++ b/packages/two_dimensional_scrollables/CHANGELOG.md @@ -1,4 +1,4 @@ -## NEXT +## 0.3.4 * Updates minimum supported SDK version to Flutter 3.27/Dart 3.6. @@ -6,6 +6,8 @@ * Updates minimum supported SDK version to Flutter 3.22/Dart 3.4. * Fixes a bug where collapsing a node in a TreeView with other offscreen nodes would dereference a null value. +* Updates the simple table sample to demonstrate different types of selection: single-cell +selection, and multi-cell selection. ## 0.3.3 From b3e9931f6cde391f70d43475402fac80745d7ef5 Mon Sep 17 00:00:00 2001 From: Renzo Olivares Date: Thu, 9 Jan 2025 12:46:08 -0800 Subject: [PATCH 5/9] dartfmt --- .../example/lib/table_view/simple_table.dart | 45 +++++++++---------- .../test/table_view/simple_table_test.dart | 3 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart b/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart index 652978e685a..83f0bd79115 100644 --- a/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart +++ b/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart @@ -37,21 +37,9 @@ class _TableExampleState extends State { return Scaffold( body: Padding( padding: const EdgeInsets.symmetric(horizontal: 50.0), - child: - _selectionMode == _TableSelection.multiCell - ? SelectionArea( - child: TableView.builder( - verticalDetails: ScrollableDetails.vertical( - controller: _verticalController, - ), - cellBuilder: _buildCell, - columnCount: 20, - columnBuilder: _buildColumnSpan, - rowCount: _rowCount, - rowBuilder: _buildRowSpan, - ), - ) - : TableView.builder( + child: _selectionMode == _TableSelection.multiCell + ? SelectionArea( + child: TableView.builder( verticalDetails: ScrollableDetails.vertical( controller: _verticalController, ), @@ -61,6 +49,17 @@ class _TableExampleState extends State { rowCount: _rowCount, rowBuilder: _buildRowSpan, ), + ) + : TableView.builder( + verticalDetails: ScrollableDetails.vertical( + controller: _verticalController, + ), + cellBuilder: _buildCell, + columnCount: 20, + columnBuilder: _buildColumnSpan, + rowCount: _rowCount, + rowBuilder: _buildRowSpan, + ), ), persistentFooterButtons: [ OverflowBar( @@ -157,10 +156,10 @@ class _TableExampleState extends State { recognizerFactories: { TapGestureRecognizer: GestureRecognizerFactoryWithHandlers( - () => TapGestureRecognizer(), - (TapGestureRecognizer t) => - t.onTap = () => print('Tap column $index'), - ), + () => TapGestureRecognizer(), + (TapGestureRecognizer t) => + t.onTap = () => print('Tap column $index'), + ), }, ); case 1: @@ -209,10 +208,10 @@ class _TableExampleState extends State { recognizerFactories: { TapGestureRecognizer: GestureRecognizerFactoryWithHandlers( - () => TapGestureRecognizer(), - (TapGestureRecognizer t) => - t.onTap = () => print('Tap row $index'), - ), + () => TapGestureRecognizer(), + (TapGestureRecognizer t) => + t.onTap = () => print('Tap row $index'), + ), }, ); case 1: diff --git a/packages/two_dimensional_scrollables/example/test/table_view/simple_table_test.dart b/packages/two_dimensional_scrollables/example/test/table_view/simple_table_test.dart index 3332d1b07a5..b7e8cad6d65 100644 --- a/packages/two_dimensional_scrollables/example/test/table_view/simple_table_test.dart +++ b/packages/two_dimensional_scrollables/example/test/table_view/simple_table_test.dart @@ -55,7 +55,8 @@ void main() { expect(position.pixels, 0.0); }); - testWidgets('Selection SegmentedButton control works', (WidgetTester tester) async { + testWidgets('Selection SegmentedButton control works', + (WidgetTester tester) async { await tester.pumpWidget(const MaterialApp(home: TableExample())); await tester.pump(); From 9e820697a78673d798f27652c07aaa29f22062ff Mon Sep 17 00:00:00 2001 From: Renzo Olivares Date: Mon, 13 Jan 2025 12:10:46 -0800 Subject: [PATCH 6/9] Update test --- .../test/table_view/simple_table_test.dart | 58 ++++++++++++++++++- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/packages/two_dimensional_scrollables/example/test/table_view/simple_table_test.dart b/packages/two_dimensional_scrollables/example/test/table_view/simple_table_test.dart index b7e8cad6d65..b967e9f51c7 100644 --- a/packages/two_dimensional_scrollables/example/test/table_view/simple_table_test.dart +++ b/packages/two_dimensional_scrollables/example/test/table_view/simple_table_test.dart @@ -2,7 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:two_dimensional_examples/table_view/simple_table.dart'; @@ -62,14 +64,64 @@ void main() { // Enable multi-cell selection and verify. await tester.tap(find.textContaining('Multi-Cell')); - await tester.pump(); + await tester.pumpAndSettle(); + + // Find two adjacent cells. Adjust these finders as needed for your specific layout. + final Finder cell1 = find.text('Tile c: 0, r: 0'); + final Finder cell2 = find.text('Tile c: 1, r: 0'); + + final Offset cell1Center = tester.getCenter(cell1); + final Offset cell2Center = tester.getCenter(cell2); + + // Long press and drag to select multiple cells. + final TestGesture gesture = await tester.startGesture(cell1Center); + await tester.pump(kLongPressTimeout); + await gesture.moveTo(cell2Center); + await gesture.up(); + await tester.pumpAndSettle(); + + final RenderParagraph paragraph1 = tester.renderObject( + find.descendant(of: cell1, matching: find.byType(RichText)), + ); + final RenderParagraph paragraph2 = tester.renderObject( + find.descendant(of: cell2, matching: find.byType(RichText)), + ); + expect(paragraph1.selections.isEmpty, isFalse); + expect(paragraph2.selections.isEmpty, isFalse); // Enable single-cell selection and verify. await tester.tap(find.textContaining('Single-Cell')); - await tester.pump(); + await tester.pumpAndSettle(); + + // Selection has been cleared. + expect(paragraph1.selections.isEmpty, isTrue); + expect(paragraph2.selections.isEmpty, isTrue); + + // Selecting from cell1 to cell2 only selects cell1. + await gesture.down(cell1Center); + await tester.pump(kLongPressTimeout); + await gesture.moveTo(cell2Center); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(paragraph1.selections.isEmpty, isFalse); + expect(paragraph2.selections.isEmpty, isTrue); // Disable selection and verify. await tester.tap(find.text('Disabled')); - await tester.pump(); + await tester.pumpAndSettle(); + + // Selection has been cleared. + expect(paragraph1.selections.isEmpty, isTrue); + expect(paragraph2.selections.isEmpty, isTrue); + + // Long pressing should not select anything. + await gesture.down(cell1Center); + await tester.pump(kLongPressTimeout); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(paragraph1.selections.isEmpty, isTrue); + expect(paragraph2.selections.isEmpty, isTrue); }); } From d01241ec80f46a76bcddd1a0ed2f78f3d55e5895 Mon Sep 17 00:00:00 2001 From: Renzo Olivares Date: Wed, 28 May 2025 11:29:03 -0700 Subject: [PATCH 7/9] update changelog --- packages/two_dimensional_scrollables/CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/two_dimensional_scrollables/CHANGELOG.md b/packages/two_dimensional_scrollables/CHANGELOG.md index 9f9d3ac7aec..41f116eb3d6 100644 --- a/packages/two_dimensional_scrollables/CHANGELOG.md +++ b/packages/two_dimensional_scrollables/CHANGELOG.md @@ -1,13 +1,13 @@ -## 0.3.4 +## 0.3.5 * Updates minimum supported SDK version to Flutter 3.27/Dart 3.6. +* Updates the simple table sample to demonstrate different types of selection: single-cell +selection, and multi-cell selection. ## 0.3.4 * Updates minimum supported SDK version to Flutter 3.22/Dart 3.4. * Fixes a bug where collapsing a node in a TreeView with other offscreen nodes would dereference a null value. -* Updates the simple table sample to demonstrate different types of selection: single-cell -selection, and multi-cell selection. ## 0.3.3 From a3eb505ff6bc32a3c8dd05abbeb40f359de4e234 Mon Sep 17 00:00:00 2001 From: Renzo Olivares Date: Wed, 28 May 2025 12:29:57 -0700 Subject: [PATCH 8/9] fix test --- .../example/lib/table_view/simple_table.dart | 4 +- .../test/table_view/simple_table_test.dart | 39 ++++++++++++++----- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart b/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart index 83f0bd79115..1a6298f3c16 100644 --- a/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart +++ b/packages/two_dimensional_scrollables/example/lib/table_view/simple_table.dart @@ -88,12 +88,12 @@ class _TableExampleState extends State { ), ], selected: <_TableSelection>{_selectionMode}, - onSelectionChanged: (Set<_TableSelection> newSelection) { + onSelectionChanged: (Set<_TableSelection> newSelectionMode) { setState(() { // By default there is only a single segment that can be // selected at one time, so its value is always the first // item in the selected set. - _selectionMode = newSelection.first; + _selectionMode = newSelectionMode.first; }); }, ), diff --git a/packages/two_dimensional_scrollables/example/test/table_view/simple_table_test.dart b/packages/two_dimensional_scrollables/example/test/table_view/simple_table_test.dart index b967e9f51c7..60cfb381f62 100644 --- a/packages/two_dimensional_scrollables/example/test/table_view/simple_table_test.dart +++ b/packages/two_dimensional_scrollables/example/test/table_view/simple_table_test.dart @@ -62,10 +62,6 @@ void main() { await tester.pumpWidget(const MaterialApp(home: TableExample())); await tester.pump(); - // Enable multi-cell selection and verify. - await tester.tap(find.textContaining('Multi-Cell')); - await tester.pumpAndSettle(); - // Find two adjacent cells. Adjust these finders as needed for your specific layout. final Finder cell1 = find.text('Tile c: 0, r: 0'); final Finder cell2 = find.text('Tile c: 1, r: 0'); @@ -73,6 +69,21 @@ void main() { final Offset cell1Center = tester.getCenter(cell1); final Offset cell2Center = tester.getCenter(cell2); + // Enable multi-cell selection and verify. + await tester.tap(find.textContaining('Multi-Cell')); + await tester.pumpAndSettle(); + + RenderParagraph paragraph1 = tester.renderObject( + find.descendant(of: cell1, matching: find.byType(RichText)), + ); + RenderParagraph paragraph2 = tester.renderObject( + find.descendant(of: cell2, matching: find.byType(RichText)), + ); + + // Selection starts empty. + expect(paragraph1.selections.isEmpty, isTrue); + expect(paragraph2.selections.isEmpty, isTrue); + // Long press and drag to select multiple cells. final TestGesture gesture = await tester.startGesture(cell1Center); await tester.pump(kLongPressTimeout); @@ -80,12 +91,6 @@ void main() { await gesture.up(); await tester.pumpAndSettle(); - final RenderParagraph paragraph1 = tester.renderObject( - find.descendant(of: cell1, matching: find.byType(RichText)), - ); - final RenderParagraph paragraph2 = tester.renderObject( - find.descendant(of: cell2, matching: find.byType(RichText)), - ); expect(paragraph1.selections.isEmpty, isFalse); expect(paragraph2.selections.isEmpty, isFalse); @@ -93,6 +98,13 @@ void main() { await tester.tap(find.textContaining('Single-Cell')); await tester.pumpAndSettle(); + paragraph1 = tester.renderObject( + find.descendant(of: cell1, matching: find.byType(RichText)), + ); + paragraph2 = tester.renderObject( + find.descendant(of: cell2, matching: find.byType(RichText)), + ); + // Selection has been cleared. expect(paragraph1.selections.isEmpty, isTrue); expect(paragraph2.selections.isEmpty, isTrue); @@ -111,6 +123,13 @@ void main() { await tester.tap(find.text('Disabled')); await tester.pumpAndSettle(); + paragraph1 = tester.renderObject( + find.descendant(of: cell1, matching: find.byType(RichText)), + ); + paragraph2 = tester.renderObject( + find.descendant(of: cell2, matching: find.byType(RichText)), + ); + // Selection has been cleared. expect(paragraph1.selections.isEmpty, isTrue); expect(paragraph2.selections.isEmpty, isTrue); From 8e4af2310f6bfdcc0fa5ac00692a3df475b195ef Mon Sep 17 00:00:00 2001 From: Renzo Olivares Date: Wed, 28 May 2025 12:33:30 -0700 Subject: [PATCH 9/9] update version in pubspec --- packages/two_dimensional_scrollables/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/two_dimensional_scrollables/pubspec.yaml b/packages/two_dimensional_scrollables/pubspec.yaml index 8549dd85dcc..e4babe71160 100644 --- a/packages/two_dimensional_scrollables/pubspec.yaml +++ b/packages/two_dimensional_scrollables/pubspec.yaml @@ -1,6 +1,6 @@ name: two_dimensional_scrollables description: Widgets that scroll using the two dimensional scrolling foundation. -version: 0.3.4 +version: 0.3.5 repository: https://github.com/flutter/packages/tree/main/packages/two_dimensional_scrollables issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+two_dimensional_scrollables%22+