You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I want to make a long list of texts selectable using the SelectionArea widget.
Since all the texts do not fit on a screen, I need to put them inside the scrollable widget such as SingleChildScrollView or ListView
I've added padding to some widgets and marked some others as unselectable by wrapping them inside theSelectionContainer.disabled() widget
Now, I can make the texts selectable by adding the SelectionArea widget either as a parent or child of the scrollable widget.
Having the SelectionArea widget as a parent allows users to scroll up/down with the selection, but if the long press starts from either the padding area or unselectable widget, it throws '!_selectionStartsInScrollable': is not true. exception.
Having the SelectionArea widget as a child of the scrollable widget, we can avoid the '!_selectionStartsInScrollable': is not true. exception, but users cannot automatically scroll up/down to change the selection.
The question is: Is there a way to make a long list of texts that NEEDS to be scrollable ALSO selectable without seeing the exception?
Steps to Reproduce
Execute flutter run on the code sample on a mobile or tablet device
Try to select the texts and change the selection by moving your fingers up/down and left/right
Now, do the same thing starting from the padding area or unselectable widget
Expected results:
No exception is thrown.
Actual results:
Below exception is thrown:
Another exception was thrown: 'package:flutter/src/widgets/scrollable.dart': Failed assertion: line 1131 pos 14: '!_selectionStartsInScrollable': is not true.
Code sample
import'package:flutter/material.dart';
voidmain() {
runApp(constMyApp());
}
classMyAppextendsStatelessWidget {
constMyApp({super.key});
@overrideWidgetbuild(BuildContext context) {
returnconstMaterialApp(
home:MyHomePage(),
);
}
}
classMyHomePageextendsStatelessWidget {
constMyHomePage({super.key});
@overrideWidgetbuild(BuildContext context) {
returnSelectionArea(
child:Scaffold(
appBar:AppBar(title:constText('SelectionArea')),
body:SingleChildScrollView(
child:Column(
children:const [
Padding(
padding:EdgeInsets.all(40.0),
child:Text(''' Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Adipiscing commodo elit at imperdiet dui. Arcu cursus vitae congue mauris rhoncus. Tristique sollicitudin nibh sit amet. Massa id neque aliquam vestibulum morbi blandit cursus risus at. Ultrices tincidunt arcu non sodales neque sodales. Lobortis scelerisque fermentum dui faucibus in. Nisl vel pretium lectus quam id leo. Quam adipiscing vitae proin sagittis nisl rhoncus mattis rhoncus. Lobortis mattis aliquam faucibus purus in massa tempor. Ligula ullamcorper malesuada proin libero nunc consequat. Tellus id interdum velit laoreet id donec ultrices tincidunt. Leo in vitae turpis massa sed elementum. Id nibh tortor id aliquet. Mi eget mauris pharetra et. Risus nec feugiat in fermentum posuere urna nec tincidunt praesent. Mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Sagittis id consectetur purus ut. Sit amet facilisis magna etiam tempor orci eu lobortis. Volutpat diam ut venenatis tellus in metus vulputate eu. Etiam non quam lacus suspendisse faucibus interdum posuere lorem ipsum. Adipiscing bibendum est ultricies integer quis auctor. In metus vulputate eu scelerisque felis. Consequat id porta nibh venenatis. Scelerisque eu ultrices vitae auctor eu augue ut lectus arcu. Nunc pulvinar sapien et ligula ullamcorper malesuada proin libero. Duis at tellus at urna condimentum. Imperdiet sed euismod nisi porta lorem. Quis hendrerit dolor magna eget est lorem ipsum dolor sit. Lectus urna duis convallis convallis tellus. Nisl nisi scelerisque eu ultrices vitae auctor. Sed velit dignissim sodales ut eu sem integer. Augue interdum velit euismod in pellentesque massa placerat. Hendrerit gravida rutrum quisque non tellus orci ac. Nunc congue nisi vitae suscipit tellus mauris a diam maecenas. Fermentum iaculis eu non diam phasellus vestibulum lorem sed risus. Vel quam elementum pulvinar etiam non quam lacus suspendisse. Vivamus arcu felis bibendum ut tristique et egestas quis. Elementum curabitur vitae nunc sed velit dignissim sodales ut. Egestas integer eget aliquet nibh. Fusce id velit ut tortor pretium. At imperdiet dui accumsan sit amet nulla. Cras adipiscing enim eu turpis egestas pretium. Lorem ipsum dolor sit amet consectetur. Venenatis tellus in metus vulputate. Lacus viverra vitae congue eu consequat ac. Dolor sit amet consectetur adipiscing. Habitant morbi tristique senectus et netus et malesuada fames. In hac habitasse platea dictumst. Sit amet volutpat consequat mauris nunc congue nisi vitae. Diam quis enim lobortis scelerisque fermentum dui faucibus in ornare. Urna cursus eget nunc scelerisque viverra. Elit sed vulputate mi sit amet mauris commodo. Vitae nunc sed velit dignissim sodales ut eu. Vestibulum lorem sed risus ultricies tristique nulla. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Egestas erat imperdiet sed euismod. Sed turpis tincidunt id aliquet risus. Vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor posuere. In eu mi bibendum neque egestas congue quisque. Aliquam malesuada bibendum arcu vitae elementum curabitur. Odio pellentesque diam volutpat commodo sed egestas. Risus in hendrerit gravida rutrum quisque non tellus orci ac. Aenean et tortor at risus. Magna fermentum iaculis eu non diam phasellus. Fusce id velit ut tortor pretium viverra suspendisse potenti. Amet dictum sit amet justo donec. Tempus imperdiet nulla malesuada pellentesque elit eget gravida. Arcu ac tortor dignissim convallis aenean et tortor. Eu non diam phasellus vestibulum. Diam sit amet nisl suscipit adipiscing. Placerat orci nulla pellentesque dignissim enim. Suscipit tellus mauris a diam. Interdum varius sit amet mattis. Viverra nam libero justo laoreet sit. At erat pellentesque adipiscing commodo elit at imperdiet. Quam lacus suspendisse faucibus interdum posuere lorem. Etiam tempor orci eu lobortis elementum nibh. Lacinia quis vel eros donec ac odio tempor orci. Ultricies mi quis hendrerit dolor magna eget. Viverra maecenas accumsan lacus vel facilisis volutpat est velit. Pellentesque habitant morbi tristique senectus et netus et. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. Felis eget nunc lobortis mattis. Turpis in eu mi bibendum neque egestas congue quisque egestas. Dui nunc mattis enim ut tellus elementum. Nulla posuere sollicitudin aliquam ultrices sagittis orci a. Mauris rhoncus aenean vel elit scelerisque. Nulla pharetra diam sit amet nisl suscipit adipiscing bibendum. Massa massa ultricies mi quis hendrerit dolor magna eget est. Mauris a diam maecenas sed enim ut sem viverra. A erat nam at lectus urna duis convallis convallis. Lectus quam id leo in vitae. Est ante in nibh mauris cursus mattis molestie. Auctor urna nunc id cursus. Aliquam sem fringilla ut morbi. Nullam vehicula ipsum a arcu cursus vitae congue mauris. Tristique senectus et netus et malesuada. Sed sed risus pretium quam vulputate. Mi tempus imperdiet nulla malesuada pellentesque. Volutpat lacus laoreet non curabitur gravida. Ornare arcu odio ut sem nulla pharetra diam sit. Integer enim neque volutpat ac tincidunt vitae semper quis. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Fames ac turpis egestas integer. Turpis cursus in hac habitasse platea dictumst quisque sagittis. Amet dictum sit amet justo donec. Cursus vitae congue mauris rhoncus aenean vel. Vel orci porta non pulvinar neque laoreet suspendisse. Fames ac turpis egestas integer eget aliquet nibh praesent tristique. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras fermentum. Quam id leo in vitae turpis. Aliquam eleifend mi in nulla posuere sollicitudin. Quisque non tellus orci ac auctor augue. Etiam dignissim diam quis enim lobortis scelerisque fermentum dui. Auctor neque vitae tempus quam. Neque gravida in fermentum et. Vivamus arcu felis bibendum ut tristique et egestas quis. Vestibulum sed arcu non odio euismod lacinia at quis risus. Eu mi bibendum neque egestas congue quisque egestas diam. Quis blandit turpis cursus in. In metus vulputate eu scelerisque felis imperdiet proin fermentum. Cursus vitae congue mauris rhoncus aenean vel elit scelerisque mauris. Massa tempor nec feugiat nisl pretium. A condimentum vitae sapien pellentesque habitant morbi. Nulla aliquet porttitor lacus luctus accumsan tortor posuere ac. Purus sit amet luctus venenatis. Eu volutpat odio facilisis mauris sit amet massa vitae. Iaculis nunc sed augue lacus viverra vitae congue eu. Et ultrices neque ornare aenean euismod elementum nisi. Accumsan in nisl nisi scelerisque eu ultrices vitae auctor eu. Morbi tristique senectus et netus. Sodales neque sodales ut etiam sit amet nisl purus. Risus feugiat in ante metus. Senectus et netus et malesuada fames ac. Eu facilisis sed odio morbi quis commodo odio aenean sed. Vitae tortor condimentum lacinia quis vel eros. Vitae semper quis lectus nulla at. Mauris ultrices eros in cursus turpis. Elementum curabitur vitae nunc sed velit. Tortor at risus viverra adipiscing at. Sodales neque sodales ut etiam sit amet nisl purus. Risus in hendrerit gravida rutrum quisque non tellus orci. Porta non pulvinar neque laoreet. Quis enim lobortis scelerisque fermentum. Erat pellentesque adipiscing commodo elit. Nunc faucibus a pellentesque sit amet porttitor. Aliquet sagittis id consectetur purus ut faucibus pulvinar. Tortor pretium viverra suspendisse potenti nullam. Cursus eget nunc scelerisque viverra. In nibh mauris cursus mattis molestie a iaculis at. Bibendum at varius vel pharetra vel turpis nunc. Volutpat odio facilisis mauris sit amet massa vitae. Rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat. Fusce ut placerat orci nulla pellentesque dignissim enim sit amet. '''),
),
SelectionContainer.disabled(
child:Text(
'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ante in nibh mauris cursus. Diam sollicitudin tempor id eu nisl nunc mi. Fermentum iaculis eu non diam phasellus. Commodo nulla facilisi nullam vehicula ipsum a arcu cursus vitae. Justo nec ultrices dui sapien eget mi proin sed. Nulla aliquet enim tortor at auctor urna nunc id cursus. Tincidunt lobortis feugiat vivamus at augue eget arcu dictum. Pharetra convallis posuere morbi leo urna molestie at elementum eu. Purus ut faucibus pulvinar elementum integer enim neque. Facilisi morbi tempus iaculis urna id volutpat lacus laoreet non. Libero justo laoreet sit amet cursus sit amet dictum sit. Sem fringilla ut morbi tincidunt augue interdum. Pulvinar pellentesque habitant morbi tristique senectus et netus. Dictum sit amet justo donec enim diam.',
),
),
],
),
),
),
);
}
}
Logs
══╡ EXCEPTION CAUGHT BY GESTURE
╞═══════════════════════════════════════════════════════════════════
The following assertion was thrown while handling a gesture:
'package:flutter/src/widgets/scrollable.dart': Failed assertion: line 1131 pos 14:
'!_selectionStartsInScrollable': is not true.
Either the assertion indicates an error in the framework itself, or we should
provide substantially
more information in this error message to help you determine and fix the underlying
cause.
In either case, please report this assertion by filing a bug on GitHub:
https://github.com/flutter/flutter/issues/new?template=2_bug.md
When the exception was thrown, this was the stack:
#2 _ScrollableSelectionContainerDelegate.handleSelectionEdgeUpdate
(package:flutter/src/widgets/scrollable.dart:1131:14)
#3 MultiSelectableSelectionContainerDelegate.dispatchSelectionEvent
(package:flutter/src/widgets/selectable_region.dart:1505:18)
#4 _SelectionContainerState.dispatchSelectionEvent
(package:flutter/src/widgets/selection_container.dart:179:29)
#5 MultiSelectableSelectionContainerDelegate.dispatchSelectionEventToChild
(package:flutter/src/widgets/selectable_region.dart:1548:23)
#6 _SelectableRegionContainerDelegate.dispatchSelectionEventToChild
(package:flutter/src/widgets/selectable_region.dart:972:18)
#7 MultiSelectableSelectionContainerDelegate._initSelection
(package:flutter/src/widgets/selectable_region.dart:1569:43)
#8 MultiSelectableSelectionContainerDelegate.handleSelectionEdgeUpdate
(package:flutter/src/widgets/selectable_region.dart:1487:47)
#9 _SelectableRegionContainerDelegate.handleSelectionEdgeUpdate
(package:flutter/src/widgets/selectable_region.dart:943:18)
#10 MultiSelectableSelectionContainerDelegate.dispatchSelectionEvent
(package:flutter/src/widgets/selectable_region.dart:1505:18)
#11 _SelectionContainerState.dispatchSelectionEvent
(package:flutter/src/widgets/selection_container.dart:179:29)
#12 _SelectableRegionState._selectEndTo
(package:flutter/src/widgets/selectable_region.dart:631:20)
#13 _SelectableRegionState._handleTouchLongPressMoveUpdate
(package:flutter/src/widgets/selectable_region.dart:360:5)
#14 LongPressGestureRecognizer._checkLongPressMoveUpdate.<anonymous closure>
(package:flutter/src/gestures/long_press.dart:767:85)
#15 GestureRecognizer.invokeCallback
(package:flutter/src/gestures/recognizer.dart:253:24)
#16 LongPressGestureRecognizer._checkLongPressMoveUpdate
(package:flutter/src/gestures/long_press.dart:767:11)
#17 LongPressGestureRecognizer.handlePrimaryPointer
(package:flutter/src/gestures/long_press.dart:657:9)
#18 PrimaryPointerGestureRecognizer.handleEvent
(package:flutter/src/gestures/recognizer.dart:615:9)
#19 PointerRouter._dispatch
(package:flutter/src/gestures/pointer_router.dart:98:12)
#20 PointerRouter._dispatchEventToRoutes.<anonymous closure>
(package:flutter/src/gestures/pointer_router.dart:143:9)
#21 _LinkedHashMapMixin.forEach
(dart:collection-patch/compact_hash.dart:617:13)
#22 PointerRouter._dispatchEventToRoutes
(package:flutter/src/gestures/pointer_router.dart:141:18)
#23 PointerRouter.route
(package:flutter/src/gestures/pointer_router.dart:127:7)
#24 GestureBinding.handleEvent
(package:flutter/src/gestures/binding.dart:460:19)
#25 GestureBinding.dispatchEvent
(package:flutter/src/gestures/binding.dart:440:22)
#26 RendererBinding.dispatchEvent
(package:flutter/src/rendering/binding.dart:337:11)
#27 GestureBinding._handlePointerEventImmediately
(package:flutter/src/gestures/binding.dart:395:7)
#28 GestureBinding.handlePointerEvent
(package:flutter/src/gestures/binding.dart:357:5)
#29 GestureBinding._flushPointerEventQueue
(package:flutter/src/gestures/binding.dart:314:7)
#30 GestureBinding._handlePointerDataPacket
(package:flutter/src/gestures/binding.dart:295:7)
#31 _invoke1 (dart:ui/hooks.dart:167:13)
#32 PlatformDispatcher._dispatchPointerDataPacket
(dart:ui/platform_dispatcher.dart:341:7)
#33 _dispatchPointerDataPacket (dart:ui/hooks.dart:94:31)
(elided 2 frames from class _AssertionError)
Handler: "onLongPressMoveUpdate"
Recognizer:
LongPressGestureRecognizer#7bd22
══╡ EXCEPTION CAUGHT BY GESTURE
╞═══════════════════════════════════════════════════════════════════
The following _CastError was thrown while handling a gesture:
Null check operator used on a null value
When the exception was thrown, this was the stack:
#0 _SelectableRegionContainerDelegate._updateLastEdgeEventsFromGeometries
(package:flutter/src/widgets/selectable_region.dart:893:62)
#1 _SelectableRegionContainerDelegate.handleSelectWord
(package:flutter/src/widgets/selectable_region.dart:922:5)
#2 MultiSelectableSelectionContainerDelegate.dispatchSelectionEvent
(package:flutter/src/widgets/selectable_region.dart:1514:18)
#3 _SelectionContainerState.dispatchSelectionEvent
(package:flutter/src/widgets/selection_container.dart:179:29)
#4 _SelectableRegionState._selectWordAt
(package:flutter/src/widgets/selectable_region.dart:693:18)
#5 _SelectableRegionState._handleTouchLongPressStart
(package:flutter/src/widgets/selectable_region.dart:354:5)
#6 LongPressGestureRecognizer._checkLongPressStart.<anonymous closure>
(package:flutter/src/gestures/long_press.dart:722:75)
#7 GestureRecognizer.invokeCallback
(package:flutter/src/gestures/recognizer.dart:253:24)
#8 LongPressGestureRecognizer._checkLongPressStart
(package:flutter/src/gestures/long_press.dart:722:11)
#9 LongPressGestureRecognizer.didExceedDeadline
(package:flutter/src/gestures/long_press.dart:620:5)
#10 PrimaryPointerGestureRecognizer.didExceedDeadlineWithEvent
(package:flutter/src/gestures/recognizer.dart:643:5)
#11 PrimaryPointerGestureRecognizer.addAllowedPointer.<anonymous closure>
(package:flutter/src/gestures/recognizer.dart:586:41)
(elided 4 frames from class _RawReceivePortImpl, class _Timer, and
dart:async-patch)
Handler: "onLongPressStart"
Recognizer:
LongPressGestureRecognizer#4956d
══╡ EXCEPTION CAUGHT BY GESTURE
╞═══════════════════════════════════════════════════════════════════
The following assertion was thrown while handling a gesture:
'package:flutter/src/widgets/scrollable.dart': Failed assertion: line 1131 pos 14:
'!_selectionStartsInScrollable': is not true.
Either the assertion indicates an error in the framework itself, or we should
provide substantially
more information in this error message to help you determine and fix the underlying
cause.
In either case, please report this assertion by filing a bug on GitHub:
https://github.com/flutter/flutter/issues/new?template=2_bug.md
When the exception was thrown, this was the stack:
#2 _ScrollableSelectionContainerDelegate.handleSelectionEdgeUpdate
(package:flutter/src/widgets/scrollable.dart:1131:14)
#3 MultiSelectableSelectionContainerDelegate.dispatchSelectionEvent
(package:flutter/src/widgets/selectable_region.dart:1505:18)
#4 _SelectionContainerState.dispatchSelectionEvent
(package:flutter/src/widgets/selection_container.dart:179:29)
#5 MultiSelectableSelectionContainerDelegate.dispatchSelectionEventToChild
(package:flutter/src/widgets/selectable_region.dart:1548:23)
#6 _SelectableRegionContainerDelegate.dispatchSelectionEventToChild
(package:flutter/src/widgets/selectable_region.dart:972:18)
#7 MultiSelectableSelectionContainerDelegate._initSelection
(package:flutter/src/widgets/selectable_region.dart:1569:43)
#8 MultiSelectableSelectionContainerDelegate.handleSelectionEdgeUpdate
(package:flutter/src/widgets/selectable_region.dart:1487:47)
#9 _SelectableRegionContainerDelegate.handleSelectionEdgeUpdate
(package:flutter/src/widgets/selectable_region.dart:943:18)
#10 MultiSelectableSelectionContainerDelegate.dispatchSelectionEvent
(package:flutter/src/widgets/selectable_region.dart:1505:18)
#11 _SelectionContainerState.dispatchSelectionEvent
(package:flutter/src/widgets/selection_container.dart:179:29)
#12 _SelectableRegionState._selectEndTo
(package:flutter/src/widgets/selectable_region.dart:631:20)
#13 _SelectableRegionState._handleTouchLongPressMoveUpdate
(package:flutter/src/widgets/selectable_region.dart:360:5)
#14 LongPressGestureRecognizer._checkLongPressMoveUpdate.<anonymous closure>
(package:flutter/src/gestures/long_press.dart:767:85)
#15 GestureRecognizer.invokeCallback
(package:flutter/src/gestures/recognizer.dart:253:24)
#16 LongPressGestureRecognizer._checkLongPressMoveUpdate
(package:flutter/src/gestures/long_press.dart:767:11)
#17 LongPressGestureRecognizer.handlePrimaryPointer
(package:flutter/src/gestures/long_press.dart:657:9)
#18 PrimaryPointerGestureRecognizer.handleEvent
(package:flutter/src/gestures/recognizer.dart:615:9)
#19 PointerRouter._dispatch
(package:flutter/src/gestures/pointer_router.dart:98:12)
#20 PointerRouter._dispatchEventToRoutes.<anonymous closure>
(package:flutter/src/gestures/pointer_router.dart:143:9)
#21 _LinkedHashMapMixin.forEach
(dart:collection-patch/compact_hash.dart:617:13)
#22 PointerRouter._dispatchEventToRoutes
(package:flutter/src/gestures/pointer_router.dart:141:18)
#23 PointerRouter.route
(package:flutter/src/gestures/pointer_router.dart:127:7)
#24 GestureBinding.handleEvent
(package:flutter/src/gestures/binding.dart:460:19)
#25 GestureBinding.dispatchEvent
(package:flutter/src/gestures/binding.dart:440:22)
#26 RendererBinding.dispatchEvent
(package:flutter/src/rendering/binding.dart:337:11)
#27 GestureBinding._handlePointerEventImmediately
(package:flutter/src/gestures/binding.dart:395:7)
#28 GestureBinding.handlePointerEvent
(package:flutter/src/gestures/binding.dart:357:5)
#29 GestureBinding._flushPointerEventQueue
(package:flutter/src/gestures/binding.dart:314:7)
#30 GestureBinding._handlePointerDataPacket
(package:flutter/src/gestures/binding.dart:295:7)
#31 _invoke1 (dart:ui/hooks.dart:167:13)
#32 PlatformDispatcher._dispatchPointerDataPacket
(dart:ui/platform_dispatcher.dart:341:7)
#33 _dispatchPointerDataPacket (dart:ui/hooks.dart:94:31)
(elided 2 frames from class _AssertionError)
Handler: "onLongPressMoveUpdate"
Recognizer:
LongPressGestureRecognizer#7bd22
No issues found! (ran in 1.6s)
[✓] Flutter (Channel stable, 3.3.8, on macOS 13.0 22A380 darwin-arm, locale en-US)
• Flutter version 3.3.8 on channel stable at /Users/heeyunlee/fvm/versions/3.3.8
• Upstream repository https://github.com/flutter/flutter.git
• Framework revision 52b3dc25f6 (13 days ago), 2022-11-09 12:09:26 +0800
• Engine revision 857bd6b74c
• Dart version 2.18.4
• DevTools version 2.15.0
[✓] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1)
• Android SDK at /Users/heeyunlee/Library/Android/sdk
• Platform android-33, build-tools 32.1.0-rc1
• Java binary at: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java
• Java version OpenJDK Runtime Environment (build 11.0.11+0-b60-7772763)
• All Android licenses accepted.
[✓] Xcode - develop for iOS and macOS (Xcode 14.1)
• Xcode at /Applications/Xcode.app/Contents/Developer
• Build 14B47b
• CocoaPods version 1.11.3
[✓] Chrome - develop for the web
• Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
[✓] Android Studio (version 2021.1)
• Android Studio at /Applications/Android Studio.app/Contents
• Flutter plugin can be installed from:
🔨 https://plugins.jetbrains.com/plugin/9212-flutter
• Dart plugin can be installed from:
🔨 https://plugins.jetbrains.com/plugin/6351-dart
• Java version OpenJDK Runtime Environment (build 11.0.11+0-b60-7772763)
[✓] VS Code (version 1.73.1)
• VS Code at /Applications/Visual Studio Code.app/Contents
• Flutter extension version 3.52.0
[✓] Connected device (4 available)
• Pixel 4a (mobile) • 0A301JEC212254 • android-arm64 • Android 13 (API 33)
• sdk gphone64 arm64 (mobile) • emulator-5554 • android-arm64 • Android 13 (API 33) (emulator)
• macOS (desktop) • macos • darwin-arm64 • macOS 13.0 22A380 darwin-arm
• Chrome (web) • chrome • web-javascript • Google Chrome 107.0.5304.110
[✓] HTTP Host Availability
• All required HTTP hosts are available
• No issues found!
I want to make a long list of texts selectable using the
SelectionAreawidget.Since all the texts do not fit on a screen, I need to put them inside the scrollable widget such as
SingleChildScrollVieworListViewI've added padding to some widgets and marked some others as unselectable by wrapping them inside the
SelectionContainer.disabled()widgetNow, I can make the texts selectable by adding the
SelectionAreawidget either as a parent or child of the scrollable widget.SelectionAreawidget as a parent allows users to scroll up/down with the selection, but if the long press starts from either the padding area or unselectable widget, it throws'!_selectionStartsInScrollable': is not true.exception.selectionarea-outside-of-scrollable.mov
log.mov
SelectionAreawidget as a child of the scrollable widget, we can avoid the'!_selectionStartsInScrollable': is not true.exception, but users cannot automatically scroll up/down to change the selection.screen-20221121-153631_2.mp4
The question is: Is there a way to make a long list of texts that NEEDS to be scrollable ALSO selectable without seeing the exception?
Steps to Reproduce
flutter runon the code sample on a mobile or tablet deviceExpected results:
No exception is thrown.
Actual results:
Below exception is thrown:
Another exception was thrown: 'package:flutter/src/widgets/scrollable.dart': Failed assertion: line 1131 pos 14: '!_selectionStartsInScrollable': is not true.Code sample
Logs