flutter / flutter

Flutter makes it easy and fast to build beautiful apps for mobile and beyond
https://flutter.dev
BSD 3-Clause "New" or "Revised" License
164.33k stars 27.12k forks source link

Flutter throws an exception when typing something while holding selection endpoint #100319

Open zxcpsd opened 2 years ago

zxcpsd commented 2 years ago

Steps to Reproduce

  1. Select any text
  2. Type any symbol while holding selection endpoint with finger (touch location should be outside the text)

Expected results: Nothing special happens.

Actual results: Application throws exception.

Code sample ```dart class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( home: Material( child: Padding( padding: EdgeInsets.all(50.0), child: TextField(), ), ), ); } } ```
Logs ``` E/MethodChannel#flutter/textinput( 9756): Failed to handle method call E/MethodChannel#flutter/textinput( 9756): java.lang.IndexOutOfBoundsException: invalid selection end: 4 E/MethodChannel#flutter/textinput( 9756): at io.flutter.embedding.engine.systemchannels.TextInputChannel$TextEditState.(TextInputChannel.java:787) E/MethodChannel#flutter/textinput( 9756): at io.flutter.embedding.engine.systemchannels.TextInputChannel$TextEditState.fromJson(TextInputChannel.java:738) E/MethodChannel#flutter/textinput( 9756): at io.flutter.embedding.engine.systemchannels.TextInputChannel$1.onMethodCall(TextInputChannel.java:103) E/MethodChannel#flutter/textinput( 9756): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:262) E/MethodChannel#flutter/textinput( 9756): at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:178) E/MethodChannel#flutter/textinput( 9756): at io.flutter.embedding.engine.dart.DartMessenger.lambda$handleMessageFromDart$0$DartMessenger(DartMessenger.java:206) E/MethodChannel#flutter/textinput( 9756): at io.flutter.embedding.engine.dart.-$$Lambda$DartMessenger$6ZD1MYkhaLxyPjtoFDxe45u43DI.run(Unknown Source:12) E/MethodChannel#flutter/textinput( 9756): at android.os.Handler.handleCallback(Handler.java:900) E/MethodChannel#flutter/textinput( 9756): at android.os.Handler.dispatchMessage(Handler.java:103) E/MethodChannel#flutter/textinput( 9756): at android.os.Looper.loop(Looper.java:219) E/MethodChannel#flutter/textinput( 9756): at android.app.ActivityThread.main(ActivityThread.java:8349) E/MethodChannel#flutter/textinput( 9756): at java.lang.reflect.Method.invoke(Native Method) E/MethodChannel#flutter/textinput( 9756): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) E/MethodChannel#flutter/textinput( 9756): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055) E/flutter ( 9756): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: PlatformException(error, invalid selection end: 4, null, java.lang.IndexOutOfBoundsException: invalid selection end: 4 E/flutter ( 9756): at io.flutter.embedding.engine.systemchannels.TextInputChannel$TextEditState.(TextInputChannel.java:787) E/flutter ( 9756): at io.flutter.embedding.engine.systemchannels.TextInputChannel$TextEditState.fromJson(TextInputChannel.java:738) E/flutter ( 9756): at io.flutter.embedding.engine.systemchannels.TextInputChannel$1.onMethodCall(TextInputChannel.java:103) E/flutter ( 9756): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:262) E/flutter ( 9756): at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:178) E/flutter ( 9756): at io.flutter.embedding.engine.dart.DartMessenger.lambda$handleMessageFromDart$0$DartMessenger(DartMessenger.java:206) E/flutter ( 9756): at io.flutter.embedding.engine.dart.-$$Lambda$DartMessenger$6ZD1MYkhaLxyPjtoFDxe45u43DI.run(Unknown Source:12) E/flutter ( 9756): at android.os.Handler.handleCallback(Handler.java:900) E/flutter ( 9756): at android.os.Handler.dispatchMessage(Handler.java:103) E/flutter ( 9756): at android.os.Looper.loop(Looper.java:219) E/flutter ( 9756): at android.app.ActivityThread.main(ActivityThread.java:8349) E/flutter ( 9756): at java.lang.reflect.Method.invoke(Native Method) E/flutter ( 9756): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) E/flutter ( 9756): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055) E/flutter ( 9756): ) E/flutter ( 9756): #0 JSONMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:164:7) E/flutter ( 9756): #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:167:18) E/flutter ( 9756): ``` ``` [√] Flutter (Channel stable, 2.8.1, on Microsoft Windows [Version 10.0.19042.1586], locale ru-RU) • Flutter version 2.8.1 at C:\DDD\prog\programs\flutter • Upstream repository https://github.com/flutter/flutter.git • Framework revision 77d935af4d (3 months ago), 2021-12-16 08:37:33 -0800 • Engine revision 890a5fca2e • Dart version 2.15.1 [√] Android toolchain - develop for Android devices (Android SDK version 31.0.0) • Android SDK at C:\DDD\prog\programs\sdks • Platform android-31, build-tools 31.0.0 • Java binary at: C:\DDD\prog\programs\andst\jre\bin\java • Java version OpenJDK Runtime Environment (build 11.0.11+9-b60-7590822) • All Android licenses accepted. [√] Chrome - develop for the web • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe [√] Android Studio (version 2021.1) • Android Studio at C:\DDD\prog\programs\andst • 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+9-b60-7590822) [√] Connected device (3 available) • PPA LX1 (mobile) • 73XNU21116203122 • android-arm64 • Android 10 (API 29) • Chrome (web) • chrome • web-javascript • Google Chrome 99.0.4844.51 • Edge (web) • edge • web-javascript • Microsoft Edge 99.0.1150.39 • No issues found! ```
danagbemava-nc commented 2 years ago

I can reproduce this on android, but it doesn't seem to reproduce on iOS with the same steps I used to reproduce on android. The exception doesn't stop the app from working, and it probably isn't noticeable if you're using flutter run.

Steps to reproduce

In the video below, you see at a certain point, I'm typing but there's no text, that is because the debugger catches the exception and the app is paused. After resuming the app, that's when the text is captured in the textfield.

video
complete code sample ```dart import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return const MaterialApp( home: Material( child: Padding( padding: EdgeInsets.all(50.0), child: TextField(), ), ), ); } } ```
flutter doctor -v ``` [✓] Flutter (Channel stable, 2.10.3, on macOS 12.2.1 21D62 darwin-arm, locale en-GB) • Flutter version 2.10.3 at /Users/nexus/dev/sdks/flutter • Upstream repository https://github.com/flutter/flutter.git • Framework revision 7e9793dee1 (2 weeks ago), 2022-03-02 11:23:12 -0600 • Engine revision bd539267b4 • Dart version 2.16.1 • DevTools version 2.9.2 [✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0) • Android SDK at /Users/nexus/Library/Android/sdk • Platform android-32, build-tools 31.0.0 • 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 13.2.1) • Xcode at /Applications/Xcode.app/Contents/Developer • CocoaPods version 1.11.2 [✓] 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) [☠] IntelliJ IDEA Community Edition (the doctor check crashed) ✗ Due to an error, the doctor check did not complete. If the error message below is not helpful, please let us know about this issue at https://github.com/flutter/flutter/issues. ✗ FormatException: Unexpected extension byte (at offset 5) • #0 _Utf8Decoder.convertSingle (dart:convert-patch/convert_patch.dart:1789:7) #1 Utf8Decoder.convert (dart:convert/utf.dart:351:42) #2 InputStream.readString (package:archive/src/util/input_stream.dart:207:30) #3 new ZipDirectory.read (package:archive/src/zip/zip_directory.dart:40:30) #4 ZipDecoder.decodeBuffer (package:archive/src/zip_decoder.dart:19:30) #5 ZipDecoder.decodeBytes (package:archive/src/zip_decoder.dart:14:12) #6 IntelliJPlugins._findPluginXml (package:flutter_tools/src/intellij/intellij.dart:130:44) #7 IntelliJPlugins._readPackageVersion (package:flutter_tools/src/intellij/intellij.dart:141:40) #8 IntelliJPlugins.validatePackage (package:flutter_tools/src/intellij/intellij.dart:63:35) #9 IntelliJValidator.validate (package:flutter_tools/src/intellij/intellij_validator.dart:103:15) #10 asyncGuard. (package:flutter_tools/src/base/async_guard.dart:111:32) #11 asyncGuard. (package:flutter_tools/src/base/async_guard.dart:109:18) #12 _rootRun (dart:async/zone.dart:1426:13) #13 _CustomZone.run (dart:async/zone.dart:1328:19) #14 _runZoned (dart:async/zone.dart:1861:10) #15 runZonedGuarded (dart:async/zone.dart:1849:12) #16 runZoned (dart:async/zone.dart:1780:12) #17 asyncGuard (package:flutter_tools/src/base/async_guard.dart:109:3) #18 Doctor.startValidatorTasks (package:flutter_tools/src/doctor.dart:205:9) #19 Doctor.diagnose (package:flutter_tools/src/doctor.dart:309:47) #20 DoctorCommand.runCommand (package:flutter_tools/src/commands/doctor.dart:50:48) #21 FlutterCommand.verifyThenRunCommand (package:flutter_tools/src/runner/flutter_command.dart:1320:12) #22 FlutterCommand.run. (package:flutter_tools/src/runner/flutter_command.dart:1161:27) #23 AppContext.run. (package:flutter_tools/src/base/context.dart:150:19) #24 CommandRunner.runCommand (package:args/command_runner.dart:209:13) #25 FlutterCommandRunner.runCommand. (package:flutter_tools/src/runner/flutter_command_runner.dart:281:9) #26 AppContext.run. (package:flutter_tools/src/base/context.dart:150:19) #27 FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:229:5) #28 run.. (package:flutter_tools/runner.dart:62:9) #29 AppContext.run. (package:flutter_tools/src/base/context.dart:150:19) #30 main (package:flutter_tools/executable.dart:94:3) [✓] VS Code (version 1.65.2) • VS Code at /Applications/Visual Studio Code.app/Contents • Flutter extension version 3.36.0 [✓] Connected device (2 available) • macOS (desktop) • macos • darwin-arm64 • macOS 12.2.1 21D62 darwin-arm • Chrome (web) • chrome • web-javascript • Google Chrome 99.0.4844.74 [✓] HTTP Host Availability • All required HTTP hosts are available ! Doctor found issues in 1 category. ``` ``` [✓] Flutter (Channel master, 2.13.0-0.0.pre.142, on macOS 12.2.1 21D62 darwin-arm, locale en-GB) • Flutter version 2.13.0-0.0.pre.142 at /Users/nexus/dev/sdks/flutters • Upstream repository https://github.com/flutter/flutter.git • Framework revision 8e11192d0f (2 hours ago), 2022-03-18 01:55:20 -0400 • Engine revision 6495796bce • Dart version 2.17.0 (build 2.17.0-216.0.dev) • DevTools version 2.11.4 [✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0) • Android SDK at /Users/nexus/Library/Android/sdk • Platform android-32, build-tools 31.0.0 • 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 13.2.1) • Xcode at /Applications/Xcode.app/Contents/Developer • CocoaPods version 1.11.2 [✓] 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) [✓] IntelliJ IDEA Community Edition (version 2021.3) • IntelliJ at /Applications/IntelliJ IDEA CE.app • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin version 213.5744.122 [✓] VS Code (version 1.65.2) • VS Code at /Applications/Visual Studio Code.app/Contents • Flutter extension version 3.36.0 [✓] Connected device (2 available) • macOS (desktop) • macos • darwin-arm64 • macOS 12.2.1 21D62 darwin-arm • Chrome (web) • chrome • web-javascript • Google Chrome 99.0.4844.74 [✓] HTTP Host Availability • All required HTTP hosts are available • No issues found! ```

android_log.log

chinmaygarde commented 2 years ago

cc @LongCatIsLooong

EgorK0rshun commented 1 year ago

cc @LongCatIsLooong

still reproduced, please check

azack commented 8 months ago

Reproduced also in Flutter 3.10.7 Dart 3.0.7. Found via Sentry alerting from multiple customers. It seems like there are a few different errors that can be hit when trying the same repro steps in a production build or in debug in emulator.

PlatformException: PlatformException(error, invalid selection start: 12, null, java.lang.IndexOutOfBoundsException: invalid selection start: 12 ``` PlatformException: PlatformException(error, invalid selection start: 12, null, java.lang.IndexOutOfBoundsException: invalid selection start: 12 at io.flutter.embedding.engine.systemchannels.TextInputChannel$TextEditState.(SourceFile:13) at io.flutter.embedding.engine.systemchannels.TextInputChannel$TextEditState.fromJson(SourceFile:6) at io.flutter.embedding.engine.systemchannels.TextInputChannel$1.onMethodCall(SourceFile:42) at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(SourceFile:2) at io.flutter.embedding.engine.dart.DartMessenger.$r8$lambda$2j2MERcK825A5j1fv5sZ7xB2Iuo(SourceFile:3) at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12) at android.os.Handler.handleCallback(Handler.java:958) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8177) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971) ```
ERROR: 'package:flutter/src/services/text_input.dart': Failed assertion: line 963 pos 12: 'range.start >= 0 && range.start <= text.length': Range start 23 is out of text of length 22 ``` I/flutter (14920): Another exception was thrown: Range start 23 is out of text of length 22 I/flutter (14920): [E] ERROR: 'package:flutter/src/services/text_input.dart': Failed assertion: line 963 pos 12: 'range.start >= 0 && range.start <= text.length': Range start 23 is out of text of length 22 I/flutter (14920): #2 TextEditingValue._textRangeIsValid (package:flutter/src/services/text_input.dart:963:12) I/flutter (14920): #3 TextEditingValue.toJSON (package:flutter/src/services/text_input.dart:918:12) I/flutter (14920): #4 _PlatformTextInputControl.setEditingState (package:flutter/src/services/text_input.dart:2249:13) I/flutter (14920): #5 TextInput._setEditingState (package:flutter/src/services/text_input.dart:1938:15) I/flutter (14920): #6 TextInputConnection.setEditingState (package:flutter/src/services/text_input.dart:1362:25) I/flutter (14920): #7 EditableTextState._updateRemoteEditingValueIfNeeded (package:flutter/src/widgets/editable_text.dart:3060:27) I/flutter (14920): #8 EditableTextState.endBatchEdit (package:flutter/src/widgets/editable_text.dart:3049:5) I/flutter (14920): #9 EditableTextState._formatAndSetValue (package:flutter/src/widgets/editable_text.dart:3596:5) I/flutter (14920): #10 EditableTextState.userUpdateTextEditingValue (package:flutter/src/widgets/editable_text.dart:3905:5) I/flutter (14920): #11 TextSelectionOverlay._handleSelectionHandleChanged (package:flutter/src/widgets/text_selection.dart:881:23) I/flutter (14920): #12 TextSelectionOverlay._handleSelectionEndHandleDragUpdate (package:flutter/src/widgets/text_selection.dart:728:7) I/flutter (14920): #13 DragGestureRecognizer._checkUpdate. (package:flutter/src/gestures/monodrag.dart:516:55) I/flutter (14920): #14 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:275:24) I/flutter (14920): #15 DragGestureRecognizer._checkUpdate (package:flutter/src/gestures/monodrag.dart:516:7) I/flutter (14920): #16 DragGestureRecognizer.handleEvent (package:flutter/src/gestures/monodrag.dart:370:9) I/flutter (14920): #17 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:98:12) I/flutter (14920): #18 PointerRouter._dispatchEventToRoutes. (package:flutter/src/gestures/pointer_router.dart:143:9) I/flutter (14920): #19 _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:625:13) I/flutter (14920): #20 PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:141:18) I/flutter (14920): #21 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:127:7) I/flutter (14920): #22 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:465:19) I/flutter (14920): #23 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:445:22) I/flutter (14920): #24 RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:331:11) I/flutter (14920): #25 GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:400:7) I/flutter (14920): #26 GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:363:5) I/flutter (14920): #27 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:320:7) I/flutter (14920): #28 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:293:9) I/flutter (14920): #29 _invoke1 (dart:ui/hooks.dart:158:13) I/flutter (14920): #30 PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:382:7) I/flutter (14920): #31 _dispatchPointerDataPacket (dart:ui/hooks.dart:91:31) ```
ERROR: 'package:flutter/src/widgets/text_selection.dart': Failed assertion: line 1139 pos 12: '!_isDraggingEndHandle': is not true. ``` I/flutter (14920): [E] ERROR: 'package:flutter/src/widgets/text_selection.dart': Failed assertion: line 1139 pos 12: '!_isDraggingEndHandle': is not true. I/flutter (14920): #2 SelectionOverlay._handleEndHandleDragStart (package:flutter/src/widgets/text_selection.dart:1139:12) I/flutter (14920): #3 DragGestureRecognizer._checkStart. (package:flutter/src/gestures/monodrag.dart:497:53) I/flutter (14920): #4 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:275:24) I/flutter (14920): #5 DragGestureRecognizer._checkStart (package:flutter/src/gestures/monodrag.dart:497:7) I/flutter (14920): #6 DragGestureRecognizer.acceptGesture (package:flutter/src/gestures/monodrag.dart:420:7) I/flutter (14920): #7 GestureArenaManager._resolveByDefault (package:flutter/src/gestures/arena.dart:268:25) I/flutter (14920): #8 GestureArenaManager._tryToResolveArena. (package:flutter/src/gestures/arena.dart:248:31) ```
escamoteur commented 1 month ago

we still get this with Flutter 3.22.0

image

and as you can see within the last 30 days it happened 1.7k times

PlatformException

PlatformException(error, invalid composing start: 21, null, java.lang.IndexOutOfBoundsException: invalid composing start: 21
    at oa.s$e.<init>(TextInputChannel.java:15)
    at oa.s$e.a(TextInputChannel.java:6)
    at oa.s$a.onMethodCall(TextInputChannel.java:43)
    at pa.k$a.a(MethodChannel.java:2)
    at da.c.l(DartMessenger.java:2)
    at da.c.m(DartMessenger.java:4)
    at da.c.g(Unknown Source:0)
    at da.b.run(Unknown Source:12)
    at android.os.Handler.handleCallback(Handler.java:958)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:230)
    at android.os.Looper.loop(Looper.java:319)
    at android.app.ActivityThread.main(ActivityThread.java:8919)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
)