React-native: NullPointerException: Versuch, die virtuelle Methode 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawable (android.content.res.Resources)' aufzurufen.

Erstellt am 11. Jan. 2018  ·  294Kommentare  ·  Quelle: facebook/react-native

Ist das ein Fehlerbericht?

Ja

Haben Sie die Richtlinien für Beiträge gelesen?

Ja, es tut mir leid, dass ich außer dieser Stapelverfolgung keine weiteren Informationen zu dieser Ausnahme anbieten kann, da der Absturzbericht von Google Analytics erfasst wurde. Ich habe keine Ahnung, diese Ausnahme erneut anzuzeigen.

Umgebung

Umgebung:
Betriebssystem: macOS Sierra 10.12.6
Knoten: 8.4.0
Garn: 0,27,5
npm: 5.4.0
Android Studio: 3.0

Pakete: (gesucht => installiert)
reaktionsnativ: 0,51,0 => 0,51,0
reagieren: 16.0.0-alpha.12 => 16.0.0-alpha.12

Zielplattform: Android (7.1.1)
Handy: MIX 2
Android: 7.1.1
java.lang.NullPointerException:
Versuchung, die virtuelle Methode 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawable (android.content.res.Resources)' für eine Nullobjektreferenz unter aufzurufen
android.graphics.drawable.DrawableContainer $ DrawableContainerState.getChild (DrawableContainer.java:888) um
android.graphics.drawable.DrawableContainer.selectDrawable (DrawableContainer.java:466) um
android.graphics.drawable.StateListDrawable.onStateChange (StateListDrawable.java:104) um
android.graphics.drawable.Drawable.setState (Drawable.java:735) at
android.graphics.drawable.DrawableWrapper.onStateChange (DrawableWrapper.java:331) um
android.graphics.drawable.Drawable.setState (Drawable.java:735) at
android.graphics.drawable.LayerDrawable.onStateChange (LayerDrawable.java:1488) um
android.graphics.drawable.Drawable.setState (Drawable.java:735) at
android.view.View.drawableStateChanged (View.java:18002) bei
android.widget.TextView.drawableStateChanged (TextView.java:4097) bei
android.view.View.refreshDrawableState (View.java:18071) bei
android.view.View.setPressed (View.java:8543) bei
android.view.View.setPressed (View.java:8521) bei
android.view.View.onTouchEvent (View.java:11218) bei
android.widget.TextView.onTouchEvent (TextView.java:8467) bei
com.facebook.react.views.textinput.ReactEditText.onTouchEvent (ReactEditText.java:150)

Bug Android Ran Commands

Hilfreichster Kommentar

Dieses Problem hat dazu geführt, dass unsere App auch in der Produktion abstürzt. Es ist ein böser Fehler, weil es wirklich schwierig ist, ihn zu reproduzieren. Wir haben eine vielversprechende Lösung für unsere App gefunden und ich möchte unsere Ergebnisse hier teilen, um anderen hoffentlich Zeit und Frust zu ersparen.

Technische Daten und Versionen

Dieser Fehler hat dazu geführt, dass unsere App auf Samsung-, Google- und LG-Android-Geräten abstürzt. Wir haben Absturzberichte von folgenden Android-Versionen erhalten:

  • 8.0.0
  • 8.1.0
  • 7.1.1

Unsere App läuft:

  • react-native : 0.53.0
  • react : 16.2.0

Was verursacht den Absturz?

Wie andere in diesem Thread bemerkt haben, scheint das Problem durch das Rendern einer Kombination aus TextInput , FlatList und ScrollView Komponenten ausgelöst zu werden. In unserem Fall haben wir einen Bildschirm mit einem einzelnen TextInput der über einem FlatList gerendert wird. Wenn eines der Elemente in FlatList getippt wird, navigiert die App zu einem neuen Bildschirm mit einem Formular. Die Stammkomponente dieses Formulars ist eine ScrollView , die eine Reihe von TextInput -Komponenten enthält (zusammen mit einigen Schaltflächen und anderen benutzerdefinierten Komponenten). Unsere App stürzt ab, wenn der Benutzer auf eines dieser FlatList -Elemente tippt (beachten Sie, dass dies nicht jedes Mal passiert).

Es ist schwierig, dieses Problem zu reproduzieren. Tatsächlich konnten wir dies nicht tun. Wir wissen jedoch, dass der Absturz an diesem Punkt im Workflow auftritt, indem wir unsere Appsee-Sitzungsaufzeichnungen ansehen.

Da wir das Problem nicht reproduzieren können, mussten wir uns beim Debuggen auf die Absturzprotokolle von Appsee verlassen. Ich habe den Stack-Trace aus den folgenden Absturzberichten kopiert (und einige verrauschte Abschnitte weggelassen). Es ist mehr oder weniger identisch mit den Stapelspuren, die andere in diesem Thread gepostet haben:

0   java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
1   at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875)
2   at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158)
3   at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433)
4   at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258)
5   at android.view.View.computeOpaqueFlags(View.java:16900)
6   at android.view.View.setBackgroundDrawable(View.java:21824)
7   at android.view.View.setBackground(View.java:21717)
8   at android.view.View.<init>(View.java:5577)
9   at android.widget.TextView.<init>(TextView.java:1144)
...
13  at android.widget.EditText.<init>(EditText.java:96)
14  at com.facebook.react.views.textinput.ReactEditText.<init>(ReactEditText.java:91)
15  at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:91)
16  at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:61)
...
35  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

Quelle des Problems

Nachdem ich diesen Thread gelesen und ein paar Stunden recherchiert hatte, fand ich den underlineColorAndroid Prop-Handler in der ReactTextInputManager.java -Datei:

@ReactProp(name = "underlineColorAndroid", customType = "Color")
public void setUnderlineColor(ReactEditText view, <strong i="10">@Nullable</strong> Integer underlineColor) {
  // Drawable.mutate() can sometimes crash due to an AOSP bug:
  // See https://code.google.com/p/android/issues/detail?id=191754 for more info
  Drawable background = view.getBackground();
  Drawable drawableToMutate = background.getConstantState() != null ?
    background.mutate() :
    background;

  if (underlineColor == null) {
    drawableToMutate.clearColorFilter();
  } else {
    drawableToMutate.setColorFilter(underlineColor, PorterDuff.Mode.SRC_IN);
  }
}

Der im Kommentar verlinkte Fehlerbericht enthält den folgenden Stack-Trace:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable()' on a null object reference
    at android.graphics.drawable.LayerDrawable$ChildDrawable.<init>(LayerDrawable.java:1723)
    at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:1792)
    at android.graphics.drawable.LayerDrawable.createConstantState(LayerDrawable.java:152)
    at android.graphics.drawable.LayerDrawable.mutate(LayerDrawable.java:1652)

Dies entspricht der Stapelverfolgung, auf die wir in unserer App stoßen. Ich gebe nicht vor, das zugrunde liegende Problem vollständig zu verstehen, aber es ist wahrscheinlich, dass die Ursache für den Absturz unserer App in der Produktion darin besteht, dass der Fehler Drawable.mutate() ausgelöst wird. Dies geschieht, wenn wir versuchen, die underlineColorAndroid -Stütze für unsere TextInput -Komponente festzulegen (und daher die ReactTextInputManager.setUnderlineColor -Methode aufzurufen).

Unsere App hat ein TextInput mit den folgenden Requisiten gerendert, von denen eines underlineColorAndroid="transparent" :

<TextInput
  ref={this.handleRef}
  value={this.props.value}
  autoCorrect={false}
  autoCapitalize="none"
  underlineColorAndroid="transparent"
  onSubmitEditing={this.handleSubmit}
  onChangeText={this.props.onChangeText}
  onFocus={this.handleFocused}
  onBlur={this.handleBlur}
  clearButtonMode="always"
/>

Wie wir es behoben haben

Wir mussten diese Requisite einstellen, um die Unterstreichung aus den TextInput -Komponenten in unserer App zu entfernen. Basierend auf unseren Erkenntnissen schien der Prop-Handler jedoch einen Android-Fehler auszulösen, der gelegentlich zum Absturz der App führte.

Glücklicherweise gibt es eine andere Möglichkeit, Unterstreichungen von TextInput -Komponenten unter Android zu entfernen. Sie können der Datei android/app/src/main/res/values/styles.xml eine Zeile hinzufügen:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowExitAnimation"><strong i="16">@android</strong>:anim/fade_out</item>
        <item name="android:windowBackground">@drawable/splash_screen</item>
+       <item name="android:editTextBackground"><strong i="17">@android</strong>:color/transparent</item>
    </style>
</resources>

Beachten Sie, dass ich auch die folgenden Vorschläge gesehen habe, aber dies hat die Unterstreichungen für uns nicht entfernt:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowExitAnimation"><strong i="22">@android</strong>:anim/fade_out</item>
        <item name="android:windowBackground">@drawable/splash_screen</item>
    </style>

+   <!-- This did *not* work for us... -->
+   <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
+     <item name="android:background"><strong i="23">@android</strong>:color/transparent</item>
+   </style>
</resources>

Damit wird das zugrunde liegende Problem nicht behoben. Es ist nur eine Problemumgehung, bei der die Verwendung der underlineColorAndroid -Stütze für TextInput -Komponenten vermieden wird.

Ich kann noch nicht mit Sicherheit sagen, dass dies tatsächlich funktioniert, da ich das Problem nicht lokal reproduzieren konnte. Wir werden diese Änderung in den kommenden Wochen in einem Update für unsere App bereitstellen. Danach müssen wir eine Weile warten, um zu sehen, ob es nicht mehr auftritt. Ich werde versuchen, mit unseren Ergebnissen zu berichten.

Viel Glück für alle, die mit diesem frustrierenden Thema ringen! Ich hoffe das hilft.

Alle 294 Kommentare

Vor dem gleichen Problem.

Gleich hier [email protected]

com.facebook.react.views.textinput.ReactEditText.onTouchEvent
ReactEditText.java - line 163
java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
1
android.graphics.drawable.DrawableContainer$DrawableContainerState.getChild DrawableContainer.java:884
2
android.graphics.drawable.DrawableContainer.selectDrawable DrawableContainer.java:466
3
android.graphics.drawable.StateListDrawable.onStateChange StateListDrawable.java:104
4
android.graphics.drawable.Drawable.setState Drawable.java:736
5
android.graphics.drawable.DrawableWrapper.onStateChange DrawableWrapper.java:331
6
android.graphics.drawable.Drawable.setState Drawable.java:736
7
android.view.View.drawableStateChanged View.java:19223
8
android.widget.TextView.drawableStateChanged TextView.java:4673
9
android.view.View.refreshDrawableState View.java:19292
10
android.view.View.setPressed View.java:9135
11
android.view.View.setPressed View.java:9113
12
android.view.View.onTouchEvent View.java:12357
13
android.widget.TextView.onTouchEvent TextView.java:10095
14
com.facebook.react.views.textinput.ReactEditText.onTouchEvent ReactEditText.java:163

Gleicher Fehler

Gleicher Fehler. Gleiches Protokoll

Gleiches hier auf RN 44.0

+1 anotha 'eins

Leute, die den Packager neu gestartet und den Cache geleert haben, haben bei mir funktioniert!

Gleiches Problem für mich. Ich benutze RN 0.51.0 und reagiere-natives-Material-Textfeld 0.12.0.

Ich stehe auch vor diesen Problemen. Das Seltsame ist, dass es sehr schwierig ist, den Fehler zu verfolgen, da der Stack-Trace keine nützlichen Informationen enthält. Ich weiß sogar nicht, wo der Fehler liegen könnte.
Wird hier aktualisiert, wenn ich die Lösung finde

Der gleiche Fehler tritt bei RN 0.52.0 auf.

Danke, dass du das gepostet hast! Es sieht so aus, als würden Sie möglicherweise nicht die neueste Version von React Native, v0.53.0, verwenden, die im Januar 2018 veröffentlicht wurde. Können Sie sicherstellen, dass dieses Problem weiterhin in der neuesten Version reproduziert werden kann?

Ich werde dies schließen, aber Sie können gerne eine neue Ausgabe öffnen, wenn Sie bestätigen können, dass dies in Version 0.53.0 oder neuer immer noch ein Problem ist.

Beitrag leisten • Was Sie von den Betreuern erwarten können

Gleiches Problem am 0.53.3

Gleicher Fehler

@ react-native-bot Problem muss erneut geöffnet werden

vor dem gleichen Problem mit Android 8

Hier gilt das gleiche. Reagieren Sie auf native 0.53.3, SM-T550, API Level 25 (Android 7.0).

Dieses Problem ist gerade bei mir aufgetaucht, React native 0.53.3 - Android 8.1.

Reagieren Sie auf native 0.53.3, Android 8, das gleiche Problem

Gleiches Problem, React-Native 0.53.0 und Android 8. Es ist seltsam, weil dieser Fehler zufällig auftritt. Ich kann keine genauen Schritte finden, um es zu reproduzieren.

Haben Sie eine Produktions-App, auf der RN 0.54.2 ausgeführt wird, und dies scheint einige Benutzer zu betreffen, die Android 8.0.0 beim Start der App ausführen.

selection_024

Warum ist dieses Problem geschlossen? Einige von uns sind mit diesem Problem in der Produktionsumgebung konfrontiert, daher ist ein "Neustart des Packagers" keine akzeptable Lösung.

Dieses Problem muss erneut geöffnet werden, da es die aktuelle Version betrifft.

Ich bin auch mit Stapelspuren konfrontiert, die verwandt sein könnten:

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
       at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875)
       at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158)
       at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433)
       at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258)
       at android.view.View.computeOpaqueFlags(View.java:16791)
       at android.view.View.setBackgroundDrawable(View.java:21710)
       at android.view.View.setBackground(View.java:21603)
       at android.view.View.<init>(View.java:5547)
       at android.widget.TextView.<init>(TextView.java:1135)
       at android.widget.EditText.<init>(EditText.java:107)
       at android.widget.EditText.<init>(EditText.java:103)
       at android.widget.EditText.<init>(EditText.java:99)
       at android.widget.EditText.<init>(EditText.java:95)
       at com.facebook.react.views.textinput.ReactEditText.<init>(ReactEditText.java:92)
       at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:94)
       at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:65)
       at com.facebook.react.uimanager.ViewManager.createView(ViewManager.java:46)
       at com.facebook.react.uimanager.NativeViewHierarchyManager.createView(NativeViewHierarchyManager.java:218)
       at com.facebook.react.uimanager.UIViewOperationQueue$CreateViewOperation.execute(UIViewOperationQueue.java:150)
       at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.dispatchPendingNonBatchedOperations(UIViewOperationQueue.java:923)
       at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.doFrameGuarded(UIViewOperationQueue.java:895)
       at com.facebook.react.uimanager.GuardedFrameCallback.doFrame(GuardedFrameCallback.java:31)
       at com.facebook.react.modules.core.ReactChoreographer$ReactChoreographerDispatcher.doFrame(ReactChoreographer.java:136)
       at com.facebook.react.modules.core.ChoreographerCompat$FrameCallback$1.doFrame(ChoreographerCompat.java:107)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:909)
       at android.view.Choreographer.doCallbacks(Choreographer.java:723)
       at android.view.Choreographer.doFrame(Choreographer.java:655)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
       at android.os.Handler.handleCallback(Handler.java:789)
       at android.os.Handler.dispatchMessage(Handler.java:98)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6938)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.DrawableContainer$DrawableContainerState$ConstantStateFuture.get(android.graphics.drawable.DrawableContainer$DrawableContainerState)' on a null object reference
       at android.graphics.drawable.DrawableContainer$DrawableContainerState.getChild(DrawableContainer.java:823)
       at android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:452)
       at android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:104)
       at android.graphics.drawable.Drawable.setState(Drawable.java:680)
       at android.graphics.drawable.DrawableWrapper.onStateChange(DrawableWrapper.java:279)
       at android.graphics.drawable.Drawable.setState(Drawable.java:680)
       at android.graphics.drawable.LayerDrawable.onStateChange(LayerDrawable.java:1381)
       at android.graphics.drawable.Drawable.setState(Drawable.java:680)
       at android.view.View.drawableStateChanged(View.java:17003)
       at android.widget.TextView.drawableStateChanged(TextView.java:3984)
       at android.view.View.refreshDrawableState(View.java:17067)
       at android.view.View.setPressed(View.java:7914)
       at android.view.View.setPressed(View.java:7892)
       at android.view.View.access$2900(View.java:708)
       at android.view.View$CheckForTap.run(View.java:21187)
       at android.os.Handler.handleCallback(Handler.java:739)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:148)
       at android.app.ActivityThread.main(ActivityThread.java:5451)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

@grabbou können wir dieses Problem erneut öffnen?

Gleiches Problem hier Android 8.0 API 26

Gleiches gilt für 0.54.2.

Ich habe es auf ein <TextInput> eingegrenzt, das in einer FlatList gerendert wird. Wenn ich dies durch ein <Text> ersetze, verschwindet das Problem.

Bitte reproduzieren Sie mit der neuesten Version, die jetzt verfügbar ist, und ich werde diese wieder öffnen.

Gleich hier @ radko93

Android 8.1 API 27

"Abhängigkeiten": {
"reagieren": "16.3.1",
"reaktionsnativ": "0,55,1",
"React-Native-Linear-Gradient": "^ 2.4.0",
"React-Native-Vector-Icons": "^ 4.6.0",
"React-Navigation": "^ 1.5.11"
},

Versuchen Sie, die virtuelle Methode 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawable (android.content.res.Resources)' für eine Nullobjektreferenz aufzurufen
createAllFutures
DrawableContainer. Java: 875
getOpacity
DrawableContainer. Java: 1158
getOpacity
DrawableContainer. Java: 433
getOpacity
InsetDrawable. Java: 258
computeOpaqueFlags
Aussicht. Java: 15698
setBackgroundDrawable
Aussicht. Java: 20502
Hintergrund einstellen
Aussicht. Java: 20395

Aussicht. Java: 5238

Textvorschau. Java: 826

Text bearbeiten. Java: 88

Text bearbeiten. Java: 84

Text bearbeiten. Java: 80

Text bearbeiten. Java: 76
setThemedContext
ReactTextInputShadowNode. Java: 80
createView
UIImplementation. Java: 282
createView
UIManagerModule. Java: 366
aufrufen
Method.java
aufrufen
JavaMethodWrapper. Java: 372
aufrufen
JavaModuleWrapper. Java: 160
Lauf
NativeRunnable.java
handleCallback
Handler. Java: 790
dispatchMessage
Handler. Java: 99
dispatchMessage
MessageQueueThreadHandler. Java: 29
Schleife
Looper. Java: 164
Lauf
MessageQueueThreadImpl. Java: 192
Lauf
Faden. Java: 764

Gleicher Fehler

package.json
"Abhängigkeiten": {
"reagieren": "16.3.1",
"reaktionsnativ": "0,55,2",
},

build.gradle
compileSdkVersion 26
buildToolsVersion "26.0.2"
minSdkVersion 16

Gleicher Fehler.

java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
    at android.graphics.drawable.DrawableContainer$DrawableContainerState.getChild(DrawableContainer.java:888)
    at android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:466)
    at android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:104)
    at android.graphics.drawable.Drawable.setState(Drawable.java:735)
    at android.graphics.drawable.DrawableWrapper.onStateChange(DrawableWrapper.java:331)
    at android.graphics.drawable.Drawable.setState(Drawable.java:735)
    at android.view.View.drawableStateChanged(View.java:18038)
    at android.widget.TextView.drawableStateChanged(TextView.java:4108)
    at android.view.View.refreshDrawableState(View.java:18107)
    at android.view.View.setPressed(View.java:8536)
    at android.view.View.setPressed(View.java:8514)
    at android.view.View.onTouchEvent(View.java:11262)
    at android.widget.TextView.onTouchEvent(TextView.java:8489)
    at com.facebook.react.views.textinput.ReactEditText.onTouchEvent(ReactEditText.java:162)
    at android.view.View.dispatchTouchEvent(View.java:10054)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2663)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2336)
    at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:432)
    at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1841)
    at android.app.Activity.dispatchTouchEvent(Activity.java:3233)
    at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:394)
    at android.view.View.dispatchPointerEvent(View.java:10286)
    at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4514)
    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4370)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3883)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3953)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3911)
    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4053)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3919)
    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4110)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3883)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3953)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3911)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3919)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3883)
    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6359)
    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6333)
    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6288)
    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6469)
    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:193)
    at android.os.MessageQueue.nativePollOnce(Native Method)
    at android.os.MessageQueue.next(MessageQueue.java:323)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:6295)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:790)

Android: 7.1.1
React-Native: 0,48,3

Gleicher Fehler.

selection_007

Gleiches Problem in der Produktionsumgebung , Mein Gerät ist HUAWEI (LLD-AL10) 8.0.0. Ich verwende derzeit React Native 0.46.2, danke

Das gleiche Problem tritt auf, wenn Sie die neueste Version von react-native (0.55.3) verwenden. Das Problem scheint mit TextInput in einer FlatList in Zusammenhang zu stehen, wie oben erwähnt. Fehler in Android 8.0 und 8.1 erhalten. Gibt es Problemumgehungen, um dieses Problem zu vermeiden?

Ich kann diesen Fehler reproduzieren, indem ich ein neues React Native-Projekt mit react-native init erstelle und die App.js in ändere

import React, { Component } from 'react';
import {
  StyleSheet,
  TextInput,
  View
} from 'react-native';

type Props = {};
export default class App extends Component<Props> {
  render() {
    const inputs = Array.apply(null, Array(256)).map((_, i) => i)
    return (
      <View>
        {inputs.map(i => <TextInput key={i} />)}
      </View>
    );
  }
}

Ich habe dies auf einem Galaxy S8 mit Android 8.0.0 unter MacOS 10.13.3 ausgeführt.

"dependencies": {
    "react": "16.3.1",
    "react-native": "0.55.3"
},

Ich weiß nicht, ob der Fehler nicht direkt mit der Anzahl der TextInputs zusammenhängt, aber nur so kann ich diesen Fehler ziemlich zuverlässig reproduzieren. Mit 128 Eingängen habe ich diesen Fehler nicht bei jedem Neustart erhalten, aber nach ein paar Neuladungen ist er aufgetreten. Bei 256 nackten TextInputs glaube ich nicht, dass ich die Anwendung starten konnte, ohne den Fehler zu erhalten. Ich habe auch festgestellt, dass das Hinzufügen von Elementen zwischen den TextInputs die Wahrscheinlichkeit verringert, dass dieser Fehler auftritt, sodass er wahrscheinlich nicht direkt an die Anzahl der TextInputs gebunden ist. Ich habe dies in meiner aktuellen Anwendung versucht und das Hinzufügen von Hunderten von TextInputs zum Startbildschirm hat diesen Fehler ebenfalls ausgelöst, aber meine anderen Ansichten mit ähnlichen Mengen an TextInputs, die in andere Elemente eingeschlossen sind, scheinen diesen Fehler nicht immer auszulösen, da ich einige in meiner Anwendung habe .

Ich habe das gleiche Problem. Ich habe dies auf einem Huawei P10 mit Android 8.0.0 ausgeführt.
"react": "^16.2.0", "react-native": "^0.55.0",
Bildschirmfoto

Es scheint, dass das Problem in den TextInputs liegt. Dies geschieht auf meinem Huawei P10 (Android 8.0.0). Gibt es dafür schon eine Lösung?

Android: 7.1.1
"React-Native": "0,53,3",
image

Danke, dass du das gepostet hast! Es sieht so aus, als würde sich Ihr Problem möglicherweise auf eine ältere Version von React Native beziehen. Können Sie das Problem in der neuesten Version v0.55 reproduzieren ?

Vielen Dank für Ihre Beiträge.

Ich stehe vor dem gleichen Problem. Es hängt mit der TextInput-Komponente zusammen. Sogar ein einzelner TextInput, der auf einem Bildschirm gerendert wird, verursacht diesen Fehler. Gibt es Problemumgehungen?

reaktionsnativ: 0,55
reagieren: 16.3.1

Ich ändere den ReactEditText-Konstruktor "super", es sieht nicht so aus,
aber kommentiere "underlineColorAndroid" aus
https://github.com/yuanboGeng/react-native/commit/36f7949f9a3e9c1f3b10df43a9f495f9f8712a1f
reaktionsnativ: 0,53,3
reagieren: 16.2.0

Dies geschah für mich, nachdem ich meinen Emulator von API-Level 21 auf API-Level 26 aktualisiert hatte

Ich hatte diesen Fehler ohne Grund während der Entwicklung. Ich habe meine / build-Ordner bereinigt und erneut ein run-android . Das Problem ist verschwunden. Sehr seltsam. Ich hoffe für einige von euch wird ein sauberer Build dieses Problem lösen.

Das gleiche Problem haben. Ein kleiner Unterschied - in meinem verschachtele ich TextInputs in einer VirtualizedList (dem übergeordneten Element von FlatList) und bekomme das Problem nur, wenn ich anfange, in dieser Liste zu scrollen, selbst dann nur zeitweise und nicht immer. Ähnlich wie bei anderen geschieht dies in einer Produktionsumgebung, sodass ein Neustart des Packagers keine Option ist.

Basierend auf einigen Grabungen scheint dies mit einem alten Problem in Android selbst zu tun zu haben :
Wenn dies das zugrunde liegende Problem ist, wird dies durch einfaches Aktualisieren der compileSdk- und Support-Bibliotheksversionen im RN-Projekt gelöst. Keine Ahnung die LoE dazu.

Update: Der Versuch, Teilprojekte zu zwingen, eine höhere Version der Build-Tools und compileSdk zu verwenden, hat dieses Problem für mein Projekt nicht gelöst, wie in diesem SO-Beitrag erläutert. Ich bin mir nicht sicher, ob ich diese höheren Versionen nur falsch angewendet habe, ob mein Build-Setup RN auf diese Weise nicht als Teilprojekt behandelt oder ob es tatsächlich keine gültige Lösung für das Problem hier war.

BEARBEITEN 2: Es scheint, dass ReactEditText nicht einmal die Support-Bibliotheksversion von EditText (AppCompatEditText) verwendet, was erklärt, warum das Upgrade der Support-Bibliothek nichts bewirkt hat. Ich untersuche dies - es werden ein paar weitere Updates erforderlich sein, als nur die Vererbung zu ändern, damit dies funktioniert, aber es könnte die richtige Lösung für dieses Problem sein.

EDIT 3: Es war nicht die Lösung. Ich bin nicht mehr sicher, dass dieses Problem mit dem verknüpften AOSP-Problem identisch ist.
Ich kann sagen, dass es anscheinend keine Rolle spielt, in welche Art von ScrollView Sie Ihren Text eingefügt haben - ich konnte sowohl in VirtualizedList als auch in ScrollView reproduzieren, und viele in diesem Thread haben dies mit einer FlatList getan.

Ich habe das gleiche in der Produktion

Ich stehe auch vor diesem Problem. Das Ausführen von cd android ; ./gradlew clean ; cd .. ; react-native run-android funktioniert für mich, wie @mbret hervorhob (danke!)

Großartig, aber was ist mit Apps in der Produktion mit echten Kunden? : |

Sorry @ahanusek , ich sage nicht, dass dies das Problem behebt, ich sage nur, dass dies in der Entwicklung für mich funktioniert hat (in der Hoffnung, dass es auch jemand anderem hilft).

Aber auch für die Entwicklung ist es keine Lösung. Ok, Sie bereinigen Ihren Build, starten die App erneut, aber wenn Sie Eingaben "kaum" verwenden, können Sie diesen Fehler trotzdem erneut erhalten.

@ahanusek Ja, ich stimme dir zu und streite in keiner Weise mit dir. Dies ist keine Lösung, aber für mich und im Moment hat es funktioniert, damit ich mich weiterentwickeln kann

Siehe auch v0.55.4:

screen shot 2018-06-12 at 1 05 41 pm

Ziemlich sicher, dass ich kein TextField in einer FlatList oder VirtualizedList habe, fwiw. Dies geschieht in unserem Produktionsaufbau.

Dieses Problem wird in v0.55.4 . Und ja, wir verwenden ein TextInput in einer Liste.

2018-06-13_23-04-20_scrot

Passiert in Reaktion 0,55. Folgen

Kommt auch in reaktionsnativen 0,55 vor, wobei die Eingabe in der flachen Liste verwendet wird.

Hier einen tatsächlichen Beitrag verfassen, falls die Leute meinen bearbeiteten Kommentar nicht sehen:

Ich kann sagen, dass es anscheinend keine Rolle spielt, in welche Art von ScrollView Sie Ihren Text eingefügt haben - ich konnte sowohl in VirtualizedList als auch in ScrollView reproduzieren, und viele in diesem Thread haben dies mit einer FlatList getan.
Oder anders ausgedrückt, das Problem läuft darauf hinaus
RN Crashes when loading a very large number of TextInputs. Usually this happens in a ScrollView (or some descended component class of one), but one person got it to happen in a plain View

Gleicher Fehler

Ich stehe auch vor dem gleichen Problem.

Seltsamerweise passierte mir das erst letzte Nacht und ich rendere TextInputs seit mehr als einem Monat in der Entwicklung auf die gleiche Weise.

Android Version 9
Reaktion "16.3.1"
React-Native "~ 0,55,2"

Wir hatten auch ein ähnliches Problem in unserem Code

Absturzprotokolle:
Schwerwiegende Ausnahme: java.lang.NullPointerException: Versuch, die virtuelle Methode 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawable (android.content.res.Resources)' für eine Nullobjektreferenz aufzurufen
at android.graphics.drawable.DrawableContainer $ DrawableContainerState.createAllFutures (DrawableContainer.java:875)
at android.graphics.drawable.DrawableContainer $ DrawableContainerState.getOpacity (DrawableContainer.java:1158)
at android.graphics.drawable.DrawableContainer.getOpacity (DrawableContainer.java:433)
at android.graphics.drawable.InsetDrawable.getOpacity (InsetDrawable.java:258)
at android.view.View.computeOpaqueFlags (View.java:16791)
bei android.view.View.setBackgroundDrawable (View.java:21710)
bei android.view.View.setBackground (View.java:21603)
bei android.view.View.(View.java:5547)
bei android.widget.TextView.(TextView.java:1135)
bei android.widget.EditText.(EditText.java:107)
bei android.widget.EditText.(EditText.java:103)
bei android.widget.EditText.(EditText.java:99)
bei android.widget.EditText.(EditText.java:95)
unter com.facebook.react.views.textinput.ReactEditText.(ReactEditText.java:92)

Was scheint hier das Problem zu sein?
Versuchte ein paar Untersuchungen:
- über 1000 edittext arbeiten in reinen android app
- Etwa 200 ReactTextInput schlagen fehl, wie hier angegeben

  • Eine Analyse des Problems ergab ein merkwürdiges Multithreading-Szenario, das von SparseArray abweicht
    - SparseArray ist nicht threadsicher und gleichzeitig enthält es die Logik von gc ()
    - SparseArray wird für DrawableContainerState verwendet, und neuer DrawableContainerState kann durch Klonen mithilfe der Drawable-Futures eines vorhandenen konstanten Status (dies ist SparseArray) erstellt werden
    - Das obige ist ein Rezept für eine Multipread-Nullpointer-Ausnahme und geschieht wie folgt
    - Der native Modulthread, der an der Erstellung des React Edit Text-Schattenknotens und seinem Lebenszyklus arbeitet, führt einen neuen EditText (reactthemedcontext) aus, der wiederum dazu führt, dass ein Hintergrund gezeichnet werden kann, der festgelegt werden kann, und schließlich den unsicheren Code des SparseArray-Threads aufruft
    - Der UI-Thread kann in der Zwischenzeit verwendet werden, um den Anzeige-EditText einer anderen RTI gleichzeitig zu erstellen, was zu demselben unsicheren Code des SparseArray-Threads führt
    - Eine Nullpointer-Ausnahme tritt auf, wenn gc () aufgerufen wird und gleichzeitig ein Klon (dieser Klon erfolgt intern in der Drawable * -Klasse) für dasselbe Objekt ausgeführt wird, wodurch ein teilweise gc-ed-Objekt entsteht. So etwas wie ein Element aus dem Wertearray wurde entfernt und auf Null gesetzt, aber das Flag noOfItems muss noch aktualisiert werden. Daher hat das geklonte Objekt ein Element weniger als im Flag noOfItems angegeben, und die Iteration kann eine Nullzeigerausnahme für den gelöschten Index verursachen.

Wie haben wir es gelöst oder zum Laufen gebracht?
[1] Verschieben Sie den neuen EditText (Kontext) -Aufruf auch in den UI-Thread und messen Sie ShadowNode asynchron, warten Sie jedoch, bis dieses EditText-Objekt im UI-Thread erstellt wurde. Schreiben Sie im Grunde den Schattenknoten setThemedContext neu und messen Sie die Funktionen
Mängel: Thread-Schalter für jede RTI

[2] Erstellen Sie EditText mit dem Layout Inflater im Native-Modul, während Sie Null für den Hintergrund angeben, und erstellen Sie den Hintergrund nur einmal, indem Sie einen EditText auf dem UI-Thread erstellen und seinen Hintergrund auf shadowNode-Ebene zwischenspeichern. Diese Zeichenfunktion wird verwendet, um den Hintergrund der mit dem Layout-Inflater erstellten dummyEditTexts festzulegen, damit die Kennzahl die zeichnbaren Grenzflächenauffüllungen berücksichtigt. In diesem Fall muss Measure nur einmal auf die Drawable-Erstellung warten

Ich habe beide getestet und sie funktionieren gut für 1024 ReactTextInput.

Hinweis: Basierend auf Untersuchungen scheint dies nicht wirklich die eleganteste Lösung zu sein, aber es funktioniert mit minimalen Änderungen und beweist die Analyse des Problems.

Vorschläge und Kritik sind herzlich willkommen!

Schattenknotencode:

`Paket.richtextinput;
android.content.Context importieren;
android.graphics.drawable.Drawable importieren;
android.os.Build importieren;
import android.text.Layout;
android.view.LayoutInflater importieren;
android.view.ViewGroup importieren;
import android.widget.EditText;
import com.facebook.infer.annotation.Assertions;
import com.facebook.react.bridge.JSApplicationIllegalArgumentException;
import com.facebook.react.common.annotations.VisibleForTesting;
import com.facebook.react.uimanager.Spacing;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.UIViewOperationQueue;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.views.text.ReactBaseTextShadowNode;
import com.facebook.react.views.text.ReactTextUpdate;
import com.facebook.react.views.textinput.ReactTextInputLocalData;
import com.facebook.react.views.view.MeasureUtil;
import com.facebook.yoga.YogaMeasureFunction;
importieren com.facebook.yoga.YogaMeasureMode;
importieren com.facebook.yoga.YogaMeasureOutput;
importieren com.facebook.yoga.YogaNode;
importieren.R;

import javax.annotation.Nullable;
// HINWEIS: Diese Klasse unterscheidet sich nicht wesentlich von ReactTextInputShadowNode, das im Mechanismus von erwartet wird
// Themenkontext einstellen und Maßnahme durchführen
Die öffentliche Klasse ReactTextInputShadowNode erweitert ReactBaseTextShadowNode implementiert YogaMeasureFunction
{
@VisibleForTesting
public static final String PROP_TEXT = "text";
private static Drawable sDummyEditTextBackgroundDrawable = null;

private int mMostRecentEventCount = UNSET;
private <strong i="13">@Nullable</strong> EditText mDummyEditText;
private <strong i="14">@Nullable</strong> ReactTextInputLocalData mLocalData;
// Represents the {<strong i="15">@code</strong> text} property only, not possible nested content.
private <strong i="16">@Nullable</strong> String mText = null;

public ReactRichTextInputShadowNode()
{
    mTextBreakStrategy = (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) ?
            0 : Layout.BREAK_STRATEGY_SIMPLE;
    setMeasureFunction(this);
}

<strong i="17">@Override</strong>
public void setThemedContext(final ThemedReactContext themedContext)
{
    super.setThemedContext(themedContext);

    // Inflating with layout using background as null because new EditText(context) call
    // can cause NullPointer Exception during a race scenario of UI thread performing EditText
    // creation with background at the same time
    //   BACKGROUND:
    // ---------------
    // SparseArray is not threadsafe and at the same time there is logic of gc() inside it
    // SparseArray is used by DrawableContainerState and new DrawableContainerState may get
    // created using the an existing constant state's drawable futures(this is SparseArray) by
    // cloning
    // The above is a recipe for a multi-threaded null pointer exception and it happens as below
    //    - Native module thread working on RTI shadow node creation and its lifecycle does a
    //      new EditText(reactThemedContext) which in turn results in background drawable to be
    //      set and finally invoking the SparseArray thread unsafe code
    //    - UI thread meanwhile could be used to create the display EditText of some other RTI
    //      at the same time leading up to the same SparseArray thread unsafe code
    //    - Null pointer exception happens when the gc() is invoked and simultaneously clone is
    //      being done for the same object giving rise to a partially gc-ed object. Something
    //      like an item from values array was removed and null-ed but the noOfItems flag is yet
    //      to be updated, so cloned object has one item less than specified in noOfItems flag
    //      and iteration can cause null pointer exception for the deleted index.
    //
    //   Solution:
    // ------------
    // Create EditText using layout inflater on Native module while specifying null for
    // background and create only once the background drawable by creating an EditText on UI
    // thread and caching its background drawable at shadowNode level. In this case measure only
    // needs to wait once for the Drawable creation
    //      Shortcomings: Ideally we would like to create the Drawable on the same Native module
    //                    thread but not able to access android.internal stylable ids to
    //                    approach this solution

    LayoutInflater sInflater =
            (LayoutInflater) themedContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    EditText editText  =
            (EditText) sInflater.inflate(R.layout.dummy_edit_text, null, false);

    // creating the EditText theme background on UI thread async to prevent above mentioned race
    // scenario
    if (sDummyEditTextBackgroundDrawable == null) {
        themedContext.runOnUiQueueThread(new Runnable() {
            <strong i="18">@Override</strong>
            public void run() {
                sDummyEditTextBackgroundDrawable = new EditText(themedContext).getBackground();
            }
        });
    }

    mDummyEditText = editText;
}

<strong i="19">@Override</strong>
public long measure(YogaNode node, float width, YogaMeasureMode widthMode, float height,
        YogaMeasureMode heightMode)
{
    // measure() should never be called before setThemedContext()
    EditText editText = Assertions.assertNotNull(mDummyEditText);

    if (mLocalData == null || sDummyEditTextBackgroundDrawable == null)
    {
        // No local data or edit text background drawable, no intrinsic size.
        return YogaMeasureOutput.make(0, 0);
    }

    // {<strong i="20">@code</strong> EditText} has by default a border at the bottom of its view
    // called "underline". To have a native look and feel of the TextEdit
    // we have to preserve it at least by default.
    // The border (underline) has its padding set by the background image
    // provided by the system (which vary a lot among versions and vendors
    // of Android), and it cannot be changed.
    // So, we have to enforce it as a default padding.
    // Sharing the same background drawable is not working in measure and Edit Text features.
    // Hence, cloning.
    editText.setBackground(sDummyEditTextBackgroundDrawable.getConstantState().newDrawable());
    setDefaultPadding(Spacing.START, editText.getPaddingStart());
    setDefaultPadding(Spacing.TOP, editText.getPaddingTop());
    setDefaultPadding(Spacing.END, editText.getPaddingEnd());
    setDefaultPadding(Spacing.BOTTOM, editText.getPaddingBottom());

    // We must measure the EditText without paddings, so we have to reset them.
    editText.setPadding(0, 0, 0, 0);

    // This is needed to fix an android bug since 4.4.3 which will throw an NPE in measure,
    // setting the layoutParams fixes it: https://code.google.com/p/android/issues/detail?id=75877
    editText.setLayoutParams(
          new ViewGroup.LayoutParams(
                  ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

    mLocalData.apply(editText);
    editText.measure(
          MeasureUtil.getMeasureSpec(width, widthMode),
          MeasureUtil.getMeasureSpec(height, heightMode));
    return YogaMeasureOutput.make(editText.getMeasuredWidth(), editText.getMeasuredHeight());
}

<strong i="21">@Override</strong>
public boolean isVirtualAnchor()
{
    return true;
}

<strong i="22">@Override</strong>
public boolean isYogaLeafNode()
{
    return true;
}

<strong i="23">@Override</strong>
public void setLocalData(Object data)
{
    Assertions.assertCondition(data instanceof ReactTextInputLocalData);
    mLocalData = (ReactTextInputLocalData) data;
    // Telling to Yoga that the node should be remeasured on next layout pass.
    dirty();
    // Note: We should NOT mark the node updated (by calling {<strong i="24">@code</strong> markUpdated}) here
    // because the state remains the same.
}
@ReactProp(name = "mostRecentEventCount")
public void setMostRecentEventCount(int mostRecentEventCount)
{
    mMostRecentEventCount = mostRecentEventCount;
}

@ReactProp(name = PROP_TEXT)
public void setText(<strong i="25">@Nullable</strong> String text)
{
    mText = text;
    markUpdated();
}

public <strong i="26">@Nullable</strong> String getText()
{
    return mText;
}

<strong i="27">@Override</strong>
public void setTextBreakStrategy(<strong i="28">@Nullable</strong> String textBreakStrategy)
{
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
    {
        return;
    }
    if (textBreakStrategy == null || "simple".equals(textBreakStrategy))
    {
        mTextBreakStrategy = Layout.BREAK_STRATEGY_SIMPLE;
    }
    else if ("highQuality".equals(textBreakStrategy))
    {
        mTextBreakStrategy = Layout.BREAK_STRATEGY_HIGH_QUALITY;
    }
    else if ("balanced".equals(textBreakStrategy))
    {
        mTextBreakStrategy = Layout.BREAK_STRATEGY_BALANCED;
    }
    else
    {
        throw new JSApplicationIllegalArgumentException("Invalid textBreakStrategy: " +
                textBreakStrategy);
    }
}

<strong i="29">@Override</strong>
public void onCollectExtraUpdates(UIViewOperationQueue uiViewOperationQueue)
{
    if (mMostRecentEventCount != UNSET)
    {
        ReactTextUpdate reactTextUpdate =
            new ReactTextUpdate(
                    spannedFromShadowNode(this, getText()),
                    mMostRecentEventCount,
                    mContainsImages,
                    getPadding(Spacing.LEFT),
                    getPadding(Spacing.TOP),
                    getPadding(Spacing.RIGHT),
                    getPadding(Spacing.BOTTOM),
                    mTextAlign,
                    mTextBreakStrategy);
        uiViewOperationQueue.enqueueUpdateExtraData(getReactTag(), reactTextUpdate);
    }
}

<strong i="30">@Override</strong>
public void setPadding(int spacingType, float padding)
{
    super.setPadding(spacingType, padding);
    markUpdated();
}

} `

Dummy Text bearbeiten Layoutdatei

<?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dummy_edit_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@null" />

@sayantanbugs hast du einen Code für diese Lösung? Vielen Dank!

Mein letzter Kommentar wurde aktualisiert und enthält nun ShadowNode-Code und das Layout zum Aufblasen des Dummy-Edittext

@sayantanbugs - Das ist eine großartige Arbeit! Wir werden es in unserem Projekt versuchen und berichten! Vielen Dank!

Gleicher Fehler
ReactNative: 0,55,4
Android: 8.0

@sayantanbugs Kannst du bitte ein Diff / Patch bereitstellen?

Gleicher Fehler. Über Crashlytics ohne viele andere Details gemeldet, daher sehr schwer zu beheben.

RN 55.3
Android 8

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
       at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875)
       at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158)
       at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433)
       at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258)
       at android.view.View.computeOpaqueFlags(View.java:16791)
       at android.view.View.setBackgroundDrawable(View.java:21710)
       at android.view.View.setBackground(View.java:21603)
       at android.view.View.<init>(View.java:5547)
       at android.widget.TextView.<init>(TextView.java:1135)
       at android.widget.EditText.<init>(EditText.java:107)
       at android.widget.EditText.<init>(EditText.java:103)
       at android.widget.EditText.<init>(EditText.java:99)
       at android.widget.EditText.<init>(EditText.java:95)
       at com.facebook.react.views.textinput.ReactTextInputShadowNode.setThemedContext(ReactTextInputShadowNode.java:80)
       at com.facebook.react.uimanager.UIImplementation.createView(UIImplementation.java:282)
       at com.facebook.react.uimanager.UIManagerModule.createView(UIManagerModule.java:366)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372)
       at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:160)
       at com.facebook.react.bridge.queue.NativeRunnable.run(NativeRunnable.java)
       at android.os.Handler.handleCallback(Handler.java:789)
       at android.os.Handler.dispatchMessage(Handler.java:98)
       at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:29)
       at android.os.Looper.loop(Looper.java:164)
       at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:192)
       at java.lang.Thread.run(Thread.java:764)

Dies ist die Hauptursache für den Absturz unserer App in der Produktion. Wann / wie kann das passieren?

Gleiches hier im Produktionsbau.
Passiert beim Bearbeiten von Text. Es ist zufällig.

reagieren: 16.3.0
reaktiv : 0,54,4
das gleiche Problem, wie man es behebt?

^^^ Mehr Leute sollten versuchen, das Problem mit der @ sayantanbugs- Lösung zu beheben. Suchen Sie einfach Ihre ReactTextInputShadowNode.java -Datei in Ihrem react-native -Ordner und tauschen Sie den von ihm angegebenen Code aus. Sie können angenehm überrascht sein.

Nach einer Woche, seit ich dies getan habe, freue ich mich, Ihnen mitteilen zu können, dass der Fehler nur einmal erneut aufgetreten ist. ABER diesmal war es anders. Ich konnte die App neu starten und normal funktionieren lassen, ohne die App über react-native run-android neu installieren zu müssen, was wirklich schmerzhaft war, da ich vorher buchstäblich den Zugriff auf ein paar Bildschirme verlieren würde hat diese TextInputs gerendert. Ich werde den Fehler weiterhin zur Kenntnis nehmen, wenn er erneut auftritt, aber bisher denke ich, dass er an meinem Ende nahezu perfekt funktioniert. Ausgezeichnetes Debugging, @sayantanbugs!

@ Friendly-Robot imo es ist keine Lösung. Es ist bestenfalls eine Problemumgehung. Dies geschieht im Produktionscode, wo wir nicht einfach eine nicht getestete Lösung patchen können, von der Sie sogar zugeben, dass sie sie nicht behebt.

Wenn es für Entwickler ärgerlich ist, auf jeden Fall. Aber ich denke nicht, dass es ratsam ist, Leute zu motivieren, es als Lösung zu verwenden. Vielleicht als Grundlage für eine PR.

Einverstanden mit @ Friendly-Robot (trotzdem danke @sayantanbugs ). Jemand von RN hier? Denken Sie, dass der Patch es bis zum RN-Repo schaffen und getestet werden kann?

Ok, ich konnte endlich den Ansatz von @sayantanbugs testen, aber es schien für mich nicht zu funktionieren (es basiert auch auf Nicht-Master-Code). Als temporäre Lösung (im Vergleich zu einer Framework-Lösung) können Sie jedoch Ihre eigene Kopie von ReactEditText mit einer gepatchten drawableStateChanged() -Methode bereitstellen:

  <strong i="9">@Override</strong>
  protected void drawableStateChanged() {
    try {
      super.drawableStateChanged();
    } catch (Exception e) {
      Timber.e("Prevented Drawable crash!");
    }
  }

Dies ist buchstäblich nur ein Patch, aber zumindest wird die Anwendung nicht abstürzen. Die Texteingabe reagiert immer noch und funktioniert, soweit ich das beurteilen kann, wie erwartet.

Bei der Reproduktion des (jetzt behobenen) Absturzes konnte ich feststellen, dass diese tatsächliche Ausnahme einige Male in schneller Folge auftrat.

BEARBEITEN:
Hmmm ... während alles zu funktionieren scheint, scheint es, dass der Drawable-Status dauerhaft beschädigt wurde. Selbst nachdem Sie eine völlig neue Ansicht mit neuen Texteingaben erstellt haben, wird die Nachricht durch Berühren einer Texteingabe erneut angezeigt. Glücklicherweise wird es nur angezeigt, wenn Sie auf die Eingabe klicken und nicht, wenn Sie Text eingeben.

Ich habe heute Abend mit meiner Ansicht und meinem Übergang gespielt. Ich habe diesen Fehler etwa zwanzig Mal erhalten. Ich habe nichts anderes getan, als auf meine Navigation zu klicken, um Übergänge zwischen Ansichten zu testen. Ich denke, das ist eine große Sache: /

Vielen Dank an @ Friendly-Robot für das Testen der Lösung!

Stimmen Sie den meisten Ansichten zu, dass meine Lösung ein Patch ist, und ich habe dies in meinem ursprünglichen Beitrag erwähnt, der die Lösung enthält. Der Grund, warum es in meinem Projekt weiterhin verwendet werden könnte, ist, dass wir auf unserer Seite eine funktionsreichere RTI erstellt haben, die die RN-RTI erweitert. Daher könnten wir meine Lösung in der ShadowNode-Implementierung meiner benutzerdefinierten RTI verwenden. Tatsächlich pflegen wir in unserem Projekt eine modifizierte Version von RN, um viele RN-Fehler / Anwendungsfälle zu beheben, und daher können wir diese Änderungen auch in diese einfließen lassen.

Ich habe vor, einen zweiten Blick auf andere Möglichkeiten zu werfen, da ich das brennende Problem in dieser Zeit innerhalb weniger Tage lösen musste.

Vielen Dank für Ihr Feedback!

@davidmontemayor , wenn dieses Problem mit dem Status "Drawable" bei meinem Fix festgestellt wird, können Sie den shadowNode so ändern, dass einfach immer neues EditText () ausgeführt wird, dieser Aufruf jedoch an UIthread verschoben wird und das Drawable ohnehin nicht behandelt wird. Das würde es definitiv beheben. Ich wollte das nicht tun, da es eine ineffiziente Möglichkeit wäre, Threads zu wechseln, wenn der eigentliche Zweck im Schattenknoten einfach darin bestand, die Randauffüllung des Hintergrunds zu erhalten, aber der von RN verwendete Mechanismus verhält sich nicht so, sondern hat einen Nebeneffekt.
Dies lässt uns denken, dass wir den ShadowNode möglicherweise selbst neu schreiben, sodass wir das EditText-Objekt nicht so benötigen, wie es an diesem Punkt verwendet wird, außer mit der Measure-Funktion.

Passiert auch für mich. Ich benutze ScrollView.
Ich habe verschiedene Steuerelemente (Radio, Liste, Edittext usw.) in einer Bildlaufansicht. Ich würde sagen, ich habe maximal 10 Steuerelemente, also keine große Liste.
Es ist jedoch schwierig zu reproduzieren. Es scheint zu zufälligen Zeiten zu passieren, aber ich denke, ich spüre es auf, um die App aus dem Hintergrund in den Vordergrund zu bringen, wenn ich ScrollView auf dem Bildschirm habe (mit Edittext-Steuerelementen darin).
Nicht 100% sicher
Ich frage mich, ob es mit der Android-Support-Lib-Version zusammenhängt.

Komm schon FB, behebe diesen Fehler.
Es ist schwierig, Apps in Produktionsqualität zu erstellen, wenn solche zufälligen Abstürze auftreten.

com.facebook.react.views.textinput.ReactEditText
RN 0,54
Android SDK 27
Telefon 8.1

Auch dieses Problem, auch mit ScrollViews. @davidmontemayor , könnten Sie seinen RN-Neuling an die Datei weiterleiten, die Sie von der Verzeichnisstruktur bearbeitet haben? Ich habe eine App auf dem Markt, die den Absturz irritierend beeinflusst, und hatte gehofft, den Fehler wie Sie zu erkennen, bis eine Lösung gefunden wurde. Haben Sie ein Beispiel für die von Ihnen verwendete Datei?

Gleich:

NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference

@Squidski - Leider wird die EditText . Für den Hintergrund gibt es zwei verschiedene Möglichkeiten, wie sich dieses Problem manifestiert:

  • Wenn der ReactEditText instanziiert wird ( android.widget.EditText.<init>(EditText.java:95) )
  • Wenn mit ReactEditText interagiert wird ( android.widget.TextView.onTouchEvent(TextView.java:8467) )

Der Schlüssel ist, die erstellte Ansicht in ReactTextInputShadowNode zu ersetzen. Anstatt es new EditText(getThemedContext()) , erstellen Sie Ihre eigene Klasse, die sich von EditText . Sie können dann die durch den zweiten Pfad verursachte Ausnahme in drawableStateChanged() abfangen.

Der schwierigere Teil ist das Beheben der Initialisierungsfehler. Dazu müssen Sie eine "Drawable Wrapper" -Klasse erstellen, mit der alle alten Drawables, die an EditText.setBackground() , verpackt werden können. Dieser Wrapper sollte dann die vom Delegaten ausgelösten Ausnahmen abfangen.

Dieses Problem tritt bei meiner App mit der neuesten Version von React Native +, dem neuesten JSC +, dem neuesten Gradle vom 25. Juli 2018 immer noch zufällig auf

React Native Environment Info:
    System:
      OS: macOS High Sierra 10.13.3
      CPU: x64 Intel(R) Core(TM) i5-5250U CPU @ 1.60GHz
      Memory: 26.19 MB / 8.00 GB
      Shell: 5.3 - /bin/zsh
    SDKs:
      iOS SDK:
        Platforms: iOS 11.4, macOS 10.13, tvOS 11.4, watchOS 4.3
    IDEs:
      Android Studio: 3.1 AI-173.4720617
      Xcode: 9.4.1/9F2000 - /usr/bin/xcodebuild
    npmPackages:
      react: ^16.4.1 => 16.4.1
      react-native: ^0.56.0 => 0.56.0
    npmGlobalPackages:
      react-native-cli: 2.0.1

JSC: org.webkit:android-jsc:r224109
Gradle: 4.8.1

Ich habe dieses Problem mit Android 8.0.0 und RN 0.55.3 gesehen. Gibt es dafür Problemumgehungen oder eine PR?

Das gleiche Problem zufällig auch mit einer FlatList von TextInputs 😞

  • React-Native: 0,55,4

java.lang.NullPointerExceptionMainActivity

java.lang.NullPointerException Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference 
    DrawableContainer.java:875 android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures
    DrawableContainer.java:1158 android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity
    DrawableContainer.java:433 android.graphics.drawable.DrawableContainer.getOpacity
    InsetDrawable.java:258 android.graphics.drawable.InsetDrawable.getOpacity
    View.java:15842 android.view.View.computeOpaqueFlags
    View.java:20658 android.view.View.setBackgroundDrawable
    View.java:20551 android.view.View.setBackground
    View.java:5290 android.view.View.<init>
    TextView.java:832 android.widget.TextView.<init>
    EditText.java:88 android.widget.EditText.<init>
    EditText.java:84 android.widget.EditText.<init>
    EditText.java:80 android.widget.EditText.<init>
    EditText.java:76 android.widget.EditText.<init>
    ReactTextInputShadowNode.java:80 com.facebook.react.views.textinput.ReactTextInputShadowNode.setThemedContext
    UIImplementation.java:282 com.facebook.react.uimanager.UIImplementation.createView
    UIManagerModule.java:366 com.facebook.react.uimanager.UIManagerModule.createView
    Method.java:-2 java.lang.reflect.Method.invoke
    JavaMethodWrapper.java:372 com.facebook.react.bridge.JavaMethodWrapper.invoke
    JavaModuleWrapper.java:160 com.facebook.react.bridge.JavaModuleWrapper.invoke
    NativeRunnable.java:-2 com.facebook.react.bridge.queue.NativeRunnable.run
    Handler.java:790 android.os.Handler.handleCallback
    Handler.java:99 android.os.Handler.dispatchMessage
    MessageQueueThreadHandler.java:29 com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage
    Looper.java:164 android.os.Looper.loop
    MessageQueueThreadImpl.java:192 com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run
    Thread.java:764 java.lang.Thread.run

Aufgrund des Lesens und Debuggens habe ich beschlossen, dieses Wochenende Folgendes zu versuchen ...

  1. Entfernen Sie alle underlineColorAndroid- Aufrufe aus meinem Code (ich verwende react-native-elements 0.19).

    • App sollte auf die Verwendung von transparent für EditText-Steuerelemente zurückgreifen
    • Versuchen Sie auch, transparent zu werden
  2. Aktualisieren Sie meine Android-Stile, um zu folgen. Dadurch wird erzwungen, dass alle EditText-Steuerelemente einen transparenten Hintergrund haben

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="android:editTextStyle">@style/AppEditTextStyle</item>
        <item name="editTextStyle">@style/AppEditTextStyle</item> <!-- For compatibility with the support library -->

    </style>

    <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
        <item name="android:background"><strong i="15">@android</strong>:color/transparent</item>
    </style>

</resources>
  1. Test - Test - Test. Problem ist schwer zu reproduzieren. Obwohl ein Kunde heute Morgen darauf gestoßen ist.

  2. Implementieren Sie als Fallback das Update von @sayantanbugs
    4.1 Aktualisieren Sie reag-native-Elemente auf 1.0xx Beta

Lesungen
https://issuetracker.google.com/issues/37068452
https://github.com/facebook/react-native/issues/18214

RN 0,54
React-native-Elemente 0.19

Passiert auf RN 0.56.0 Android 8.1.0
Ich frage mich, ob es Pläne gibt, es voranzutreiben.

Versuchen Sie, alle Instanzen von zu ersetzen
underlineColorAndroid={"transparent"}
mit
underlineColorAndroid={"#00000000"}

Mit diesem Problem. Löse es mit etwas Kniffligem. Erstellen Sie eine Schaltfläche, die das Rendern der aktuellen Eingabe übernimmt. Wir haben also eine FlatList mit Schaltflächen und nur TextInput, den wir gerade bearbeiten. Ohne ref benötigen wir einen Doppelklick, um die Bearbeitungseingabe zu starten

handleShowInput(key) {
    const { inputKeyToShow } = this.state;

    if (!inputKeyToShow) {
        this.setState({
            inputKeyToShow: key,
        }, () => this.textInput.focus());
    } else {
        this.setState({
            inputKeyToShow: null,
        });
    }
}
{inputKeyToShow !== key ?
    (
        <TouchableOpacity
            ...
            onPress={() => this.handleShowInput(key)}
        >
            <Text>{value}</Text>
        </TouchableOpacity>
    ) :
    (
        <TextInput
            ...
            ref={ref => (this.textInput = ref)}
            value={value}
            onEndEditing={() => this.handleShowInput(key)}
        />
    )
}

@WilliamAlexander @paulroy Hat Ihre Lösung funktioniert?

@xstreamcl Die Lösung, die ich gepostet habe, funktioniert bisher. Über 2 Wochen und ich habe das Problem nicht gesehen.
Benötigt aber mehr Tests;)

Dieses Problem hat dazu geführt, dass unsere App auch in der Produktion abstürzt. Es ist ein böser Fehler, weil es wirklich schwierig ist, ihn zu reproduzieren. Wir haben eine vielversprechende Lösung für unsere App gefunden und ich möchte unsere Ergebnisse hier teilen, um anderen hoffentlich Zeit und Frust zu ersparen.

Technische Daten und Versionen

Dieser Fehler hat dazu geführt, dass unsere App auf Samsung-, Google- und LG-Android-Geräten abstürzt. Wir haben Absturzberichte von folgenden Android-Versionen erhalten:

  • 8.0.0
  • 8.1.0
  • 7.1.1

Unsere App läuft:

  • react-native : 0.53.0
  • react : 16.2.0

Was verursacht den Absturz?

Wie andere in diesem Thread bemerkt haben, scheint das Problem durch das Rendern einer Kombination aus TextInput , FlatList und ScrollView Komponenten ausgelöst zu werden. In unserem Fall haben wir einen Bildschirm mit einem einzelnen TextInput der über einem FlatList gerendert wird. Wenn eines der Elemente in FlatList getippt wird, navigiert die App zu einem neuen Bildschirm mit einem Formular. Die Stammkomponente dieses Formulars ist eine ScrollView , die eine Reihe von TextInput -Komponenten enthält (zusammen mit einigen Schaltflächen und anderen benutzerdefinierten Komponenten). Unsere App stürzt ab, wenn der Benutzer auf eines dieser FlatList -Elemente tippt (beachten Sie, dass dies nicht jedes Mal passiert).

Es ist schwierig, dieses Problem zu reproduzieren. Tatsächlich konnten wir dies nicht tun. Wir wissen jedoch, dass der Absturz an diesem Punkt im Workflow auftritt, indem wir unsere Appsee-Sitzungsaufzeichnungen ansehen.

Da wir das Problem nicht reproduzieren können, mussten wir uns beim Debuggen auf die Absturzprotokolle von Appsee verlassen. Ich habe den Stack-Trace aus den folgenden Absturzberichten kopiert (und einige verrauschte Abschnitte weggelassen). Es ist mehr oder weniger identisch mit den Stapelspuren, die andere in diesem Thread gepostet haben:

0   java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
1   at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875)
2   at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158)
3   at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433)
4   at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258)
5   at android.view.View.computeOpaqueFlags(View.java:16900)
6   at android.view.View.setBackgroundDrawable(View.java:21824)
7   at android.view.View.setBackground(View.java:21717)
8   at android.view.View.<init>(View.java:5577)
9   at android.widget.TextView.<init>(TextView.java:1144)
...
13  at android.widget.EditText.<init>(EditText.java:96)
14  at com.facebook.react.views.textinput.ReactEditText.<init>(ReactEditText.java:91)
15  at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:91)
16  at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:61)
...
35  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

Quelle des Problems

Nachdem ich diesen Thread gelesen und ein paar Stunden recherchiert hatte, fand ich den underlineColorAndroid Prop-Handler in der ReactTextInputManager.java -Datei:

@ReactProp(name = "underlineColorAndroid", customType = "Color")
public void setUnderlineColor(ReactEditText view, <strong i="10">@Nullable</strong> Integer underlineColor) {
  // Drawable.mutate() can sometimes crash due to an AOSP bug:
  // See https://code.google.com/p/android/issues/detail?id=191754 for more info
  Drawable background = view.getBackground();
  Drawable drawableToMutate = background.getConstantState() != null ?
    background.mutate() :
    background;

  if (underlineColor == null) {
    drawableToMutate.clearColorFilter();
  } else {
    drawableToMutate.setColorFilter(underlineColor, PorterDuff.Mode.SRC_IN);
  }
}

Der im Kommentar verlinkte Fehlerbericht enthält den folgenden Stack-Trace:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable()' on a null object reference
    at android.graphics.drawable.LayerDrawable$ChildDrawable.<init>(LayerDrawable.java:1723)
    at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:1792)
    at android.graphics.drawable.LayerDrawable.createConstantState(LayerDrawable.java:152)
    at android.graphics.drawable.LayerDrawable.mutate(LayerDrawable.java:1652)

Dies entspricht der Stapelverfolgung, auf die wir in unserer App stoßen. Ich gebe nicht vor, das zugrunde liegende Problem vollständig zu verstehen, aber es ist wahrscheinlich, dass die Ursache für den Absturz unserer App in der Produktion darin besteht, dass der Fehler Drawable.mutate() ausgelöst wird. Dies geschieht, wenn wir versuchen, die underlineColorAndroid -Stütze für unsere TextInput -Komponente festzulegen (und daher die ReactTextInputManager.setUnderlineColor -Methode aufzurufen).

Unsere App hat ein TextInput mit den folgenden Requisiten gerendert, von denen eines underlineColorAndroid="transparent" :

<TextInput
  ref={this.handleRef}
  value={this.props.value}
  autoCorrect={false}
  autoCapitalize="none"
  underlineColorAndroid="transparent"
  onSubmitEditing={this.handleSubmit}
  onChangeText={this.props.onChangeText}
  onFocus={this.handleFocused}
  onBlur={this.handleBlur}
  clearButtonMode="always"
/>

Wie wir es behoben haben

Wir mussten diese Requisite einstellen, um die Unterstreichung aus den TextInput -Komponenten in unserer App zu entfernen. Basierend auf unseren Erkenntnissen schien der Prop-Handler jedoch einen Android-Fehler auszulösen, der gelegentlich zum Absturz der App führte.

Glücklicherweise gibt es eine andere Möglichkeit, Unterstreichungen von TextInput -Komponenten unter Android zu entfernen. Sie können der Datei android/app/src/main/res/values/styles.xml eine Zeile hinzufügen:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowExitAnimation"><strong i="16">@android</strong>:anim/fade_out</item>
        <item name="android:windowBackground">@drawable/splash_screen</item>
+       <item name="android:editTextBackground"><strong i="17">@android</strong>:color/transparent</item>
    </style>
</resources>

Beachten Sie, dass ich auch die folgenden Vorschläge gesehen habe, aber dies hat die Unterstreichungen für uns nicht entfernt:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowExitAnimation"><strong i="22">@android</strong>:anim/fade_out</item>
        <item name="android:windowBackground">@drawable/splash_screen</item>
    </style>

+   <!-- This did *not* work for us... -->
+   <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
+     <item name="android:background"><strong i="23">@android</strong>:color/transparent</item>
+   </style>
</resources>

Damit wird das zugrunde liegende Problem nicht behoben. Es ist nur eine Problemumgehung, bei der die Verwendung der underlineColorAndroid -Stütze für TextInput -Komponenten vermieden wird.

Ich kann noch nicht mit Sicherheit sagen, dass dies tatsächlich funktioniert, da ich das Problem nicht lokal reproduzieren konnte. Wir werden diese Änderung in den kommenden Wochen in einem Update für unsere App bereitstellen. Danach müssen wir eine Weile warten, um zu sehen, ob es nicht mehr auftritt. Ich werde versuchen, mit unseren Ergebnissen zu berichten.

Viel Glück für alle, die mit diesem frustrierenden Thema ringen! Ich hoffe das hilft.

Danke @Hopding anscheinend

@ Hopding
Yep Working vielen Dank

Für uns sind dieses Problem und all die ähnlichen Probleme, bei denen Sie eine aufrufende Methode für eine Nullreferenz in Android herausfinden, darauf zurückzuführen, dass die App nicht den richtigen Stil aufweist .

Die Sache ist, dass sich die meisten react-native -Komponenten - wenn nicht alle - von appcompat -Komponenten erstrecken; dh . Daher ist ein Stil wie dieser obligatorisch:

At somewhere like: /android/app/src/main/res/values/styles.xml

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    </style>
</resources>

Dies liegt daran, dass die appcopmat -Komponente nicht an erster Stelle gerendert wird und daher view.getDrawable() einen Nullwert zurückgibt, von dem Sie keine Methode wie setUnderlineColor oder setColorTint aufrufen können

In unserem Fall können wir nicht steuern, ob die Stile in der endgültigen App vorhanden sind, da wir react-native , um native Bibliotheken zu erstellen, die später in nativen Anwendungen installiert werden. Zumindest sind wir uns dieses Problems jetzt bewusst und haben unsere Dokumentation verbessert;)

Ich hoffe es hilft!

@sospedra Dein Kommentar ist sinnvoll, aber ich habe meinen Code überprüft und festgestellt, dass appcompat in meinem Stil bereits vorhanden ist. Wenn Sie Hopding's Workaround überprüfen, hat er auch bereits appcompat .

@ Hopding
Dieser Stil funktioniert gut:

@WilliamAlexander , ich konnte Ihren Vorschlag nicht zum
Das andere Problem, mit dem ich konfrontiert bin, ist, dass beim Anwenden von @ Hopding 's Fix das Layout meiner mehrzeiligen Texteingabe beeinflusst wurde, sodass die Tastatur die Texteingabe jetzt teilweise abdeckt. Ich reiße mir die Haare aus und versuche, dieses scheinbar einfache Problem zu beheben

Update: Der Stil von

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:editTextStyle">@style/AppEditTextStyle</item>
    </style>

    <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
     <item name="android:background"><strong i="11">@android</strong>:color/transparent</item>
     <item name="android:paddingTop">??dp</item>
     <item name="android:paddingBottom">??dp</item>
    </style>

Ich musste die Polsterung hinzufügen, um den Layoutbruch zu beheben.

@ gavin-gmlab.

Hier ist es.
`

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <!-- Main theme colors -->
    <!--   your app branding color for the app bar -->
    <item name="android:colorPrimary">@color/colorPrimary</item>
    <!--   darker variant for the status bar and contextual app bars -->
    <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
    <!--   theme UI controls like checkboxes and text fields -->
    <item name="android:colorAccent">@color/colorAccent</item>

    <item name="android:editTextStyle">@style/AppEditTextStyle</item>
    <item name="editTextStyle">@style/AppEditTextStyle</item> <!-- For compatibility with the support library -->

    <item name="android:windowIsTranslucent">true</item>
</style>

 <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
    <item name="android:background"><strong i="9">@android</strong>:color/transparent</item>
</style>

`

UnderlineColorAndroid = "transparent" entfernt

und style.xml geändert


Es funktioniert für mich

Keine der oben genannten Lösungen hat bei mir funktioniert, aber anscheinend hat das Schließen der App sowie des Packagers und das erneute Ausführen funktioniert.

Löschen Sie einfach Ihre App-Daten und führen Sie sie erneut aus

Vielen Dank an @WilliamAlexander und @Hopding für ihre Lösung, aber wenn ich den Hintergrund ändere, wird auch die Polsterung meines InputText entfernt. Stattdessen habe ich backgroundTint verwendet und es funktioniert ohne Änderung der Polsterung

`` ``

<style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
    <item name="backgroundTint"><strong i="12">@android</strong>:color/transparent</item>
</style>

`` ``

Ok, gibt es eine Lösung für Expo-Benutzer außer dem Auswerfen?

@Twishka Leider müssten Sie auch auf Raw React-Native auswerfen, da Expokit die gleichen Probleme hat.

Ich setze nicht einmal underlineColorAndroid irgendwo in meiner App, sondern habe dieses Protokoll immer noch in meiner Firebase-Konsole. Und ich habe keine Ahnung, wie ich dieses Problem wiedergeben soll.

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
       at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875)
       at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158)
       at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433)
       at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258)
       at android.view.View.computeOpaqueFlags(View.java:15945)
       at android.view.View.setBackgroundDrawable(View.java:20887)
       at android.view.View.setBackground(View.java:20780)
       at android.view.View.(View.java:5311)
       at android.widget.TextView.(TextView.java:850)
       at android.widget.EditText.(EditText.java:95)
       at android.widget.EditText.(EditText.java:91)
       at android.widget.EditText.(EditText.java:87)
       at android.widget.EditText.(EditText.java:83)
       at com.facebook.react.views.textinput.ReactEditText.(SourceFile:92)
       at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(SourceFile:100)
       at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(SourceFile:60)
       at com.facebook.react.uimanager.ViewManager.createView(SourceFile:42)
       at com.facebook.react.uimanager.NativeViewHierarchyManager.createView(SourceFile:260)
       at com.facebook.react.uimanager.UIViewOperationQueue$CreateViewOperation.execute(SourceFile:200)
       at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.dispatchPendingNonBatchedOperations(SourceFile:1085)
       at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.doFrameGuarded(SourceFile:1056)
       at com.facebook.react.uimanager.GuardedFrameCallback.doFrame(SourceFile:29)
       at com.facebook.react.modules.core.ReactChoreographer$ReactChoreographerDispatcher.doFrame(SourceFile:134)
       at com.facebook.react.modules.core.ChoreographerCompat$FrameCallback$1.doFrame(SourceFile:105)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:918)
       at android.view.Choreographer.doCallbacks(Choreographer.java:732)
       at android.view.Choreographer.doFrame(Choreographer.java:661)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906)
       at android.os.Handler.handleCallback(Handler.java:790)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:187)
       at android.app.ActivityThread.main(ActivityThread.java:7025)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:514)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888)

Apropos Farben: Ich habe placeHolderTextColor und borderColor auf #acacac und wenn ein Validierungsproblem auftritt, auf borderColor auf red . Abgesehen davon setze ich nicht einmal underlineColorAndroid .

Jede Hilfe wird geschätzt.

@mddanishansari Da rn 0.56 underlineColorAndroid standardmäßig festgelegt ist , benötigen Sie den oben genannten Fix.

@mddanishansari Da rn 0.56 underlineColorAndroid standardmäßig festgelegt ist , benötigen Sie den oben genannten Fix.

Vielen Dank. Ich hatte nicht erwartet, so schnell zu antworten. Das Problem ist, dass dann auch alle anderen ursprünglichen nativen EditText Hintergründe transparent sind, was seltsam aussieht. Einige Bildschirme meiner App sind auch in Original native (Java).

Ich habe mich nur gefragt, wie dieses Problem tatsächlich gelöst werden kann. Die bereitgestellte Lösung ist nur ein einfacher Hack. Recht?

Hallo Leute. Die Verwendung von underlineColorAndroid löst diesen Absturz also irgendwie aus.
Aber jetzt ist underlineColorAndroid jetzt standardmäßig eingestellt.
Wie kann dies vermieden und auf die Datei styles.xml zurückgegriffen werden?

Grüße

Nur für den Fall, dass dies jemandem hilft. In meinem Fall habe ich versehentlich NaN anstelle des tatsächlichen Farbwerts gesendet, der mir in 'borderBottomLeftRadius' passiert ist. Ich hatte keine Probleme mit dem Iphone, nur mit Android.

Die Lösungen in diesem Thread funktionieren bei mir nicht. Selbst wenn ich underlineColorAndroid für alle meine Texteingaben auf etwas nicht Transparentes setze (ich habe mit '#f00' getestet), tritt dieses Problem immer noch auf.

Für mich tritt das Problem nicht konsequent auf. Ich habe eine Reihe von TextInputs in einer ScrollView und muss den Bildschirm mehrmals öffnen und schließen, damit er auftritt

Es ist nicht die Transparenz, die den Fehler verursacht, es ist die Änderung der
native Farbe aus der reaktiven nativen Stütze. Es ist nur so, dass fast jeder
macht die native Unterstreichung mit der Requisite transparent.

Am Mittwoch, 6. Februar 2019, 22:23 Uhr schrieb Adrien Pyke [email protected] :

Die Lösungen in diesem Thread funktionieren bei mir nicht. Auch beim Einstellen der
underlineColorAndroid für alle meine Texteingaben zu etwas nicht transparentem
(Ich habe mit '# f00' getestet) Ich habe immer noch dieses Problem.

Für mich tritt das Problem nicht konsequent auf. Ich habe eine Reihe von TextInputs
innerhalb einer ScrollView, und ich muss den Bildschirm mehrmals öffnen und schließen
damit es auftritt

- -
Sie erhalten dies, weil Sie kommentiert haben.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/facebook/react-native/issues/17530#issuecomment-461283498 ,
oder schalten Sie den Thread stumm
https://github.com/notifications/unsubscribe-auth/AOG_BAlfs-GKED4gOuvtKlMD0vwEH-_zks5vK6ozgaJpZM4RaUHf
.

OK, ich verstehe.

Aus Neugier habe ich versucht, den Standardwert von transparent von hier zu entfernen

https://github.com/facebook/react-native/commit/a3a98eb1c7fa0054a236d45421393874ce8ce558

Interessanterweise tritt der Fehler bei mir immer noch auf

Ich habe gerade diesen Fehler auf RN 58.3 Android erlebt. Es gab keinen offensichtlichen Reim oder Grund, außer dass der Fehler immer dann ausgelöst wurde, wenn ich eine TextInput -Komponente renderte. Selbst wenn ich einen TextInput ohne Requisiten oder Änderungen rendern würde, würde er immer noch abstürzen.

Ich habe versucht, Metro neu zu starten und den Cache zurückzusetzen, aber das hat nicht funktioniert. Ich musste tatsächlich Android Studio öffnen und die App neu erstellen. Ab diesem Zeitpunkt funktionierte sie. Könnte dies möglicherweise ein Problem sein, wenn gradle Abhängigkeiten nicht richtig bündelt oder so? Es scheint ein langer Weg zu sein, seit ich mich gut 4 Stunden lang entwickelt habe, ohne etwas neu zu starten, bevor ich dieses Problem hatte, aber ich kann mir wirklich nicht vorstellen, was es sonst noch verursachen könnte.

Ich habe diesen Fehler in RN 58.0 auf Geräten festgestellt:
Redmi Note 6 Pro - Android 8.1
Mi A2 Lite - Android 9
WAS-LX1A - Android 8

Erscheint manchmal durch einen Blick in Sentry, hoffe es hilft.

Werden Entwickler dieses Problem beheben? Problemumgehung ist für uns nicht geeignet!

Ich habe das gleiche in der Produktion

Wir haben die gleiche Stapelspur wie zwei oben in React 0.59

(mit DrawableContainerState.createAllFutures in der 2. Zeile der Stapelverfolgung)

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
       at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875)
       at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158)
       at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433)
       at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258)
       at android.view.View.computeOpaqueFlags(View.java:15718)
       at android.view.View.setBackgroundDrawable(View.java:20528)
       at android.view.View.setBackground(View.java:20421)
       at android.view.View.<init>(View.java:5248)
       at android.widget.TextView.<init>(TextView.java:826)
       at android.widget.EditText.<init>(EditText.java:88)
       at android.widget.EditText.<init>(EditText.java:84)
       at android.widget.EditText.<init>(EditText.java:80)
       at android.widget.EditText.<init>(EditText.java:76)
       at com.facebook.react.views.textinput.ReactEditText.<init>(ReactEditText.java:89)
       at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:102)
       at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:62)
       at com.facebook.react.uimanager.ViewManager.createView(ViewManager.java:47)
       at com.facebook.react.uimanager.NativeViewHierarchyManager.createView(NativeViewHierarchyManager.java:256)
       at com.facebook.react.uimanager.UIViewOperationQueue$CreateViewOperation.execute(UIViewOperationQueue.java:200)
       at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.dispatchPendingNonBatchedOperations(UIViewOperationQueue.java:1109)
       at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.doFrameGuarded(UIViewOperationQueue.java:1080)
       at com.facebook.react.uimanager.GuardedFrameCallback.doFrame(GuardedFrameCallback.java:29)
       at com.facebook.react.modules.core.ReactChoreographer$ReactChoreographerDispatcher.doFrame(ReactChoreographer.java:166)
       at com.facebook.react.modules.core.ChoreographerCompat$FrameCallback$1.doFrame(ChoreographerCompat.java:84)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1027)
       at android.view.Choreographer.doCallbacks(Choreographer.java:841)
       at android.view.Choreographer.doFrame(Choreographer.java:769)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1015)
       at android.os.Handler.handleCallback(Handler.java:794)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:176)
       at android.app.ActivityThread.main(ActivityThread.java:6635)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

Ich habe gerade den gleichen Stacktrace wie oben erhalten, nachdem ich vor wenigen Stunden die Produktionsversion von 0.58.6 auf 0.59.1 aktualisiert habe. Ich fürchte, es wird sich als ernstes Problem herausstellen.

Irgendeine Lösung für dieses Problem?

@sunnylqm gibt es eine Möglichkeit, underlineColorAndroid auf null zu setzen, da es standardmäßig gesetzt ist?

@pedrosimao @tamdao
Sie müssen diese Zeile manuell über ein Patch-Tool wie das Patch-Paket entfernen. Und wenn Sie die Unterstreichung dennoch unsichtbar machen möchten, müssen Sie sie in einer XML-Konfiguration festlegen.
Der entscheidende Punkt ist also not set any value to underlineColorAndroid anywhere bis ein Held einen Weg gefunden hat, dies zu patchen.

Ich habe diesen Fehler heute bekommen
Es funktioniert gut, aber nach einigen Builds ist der Fehler auf meinem Gerät aufgetreten
Problemumgehung für dieses Problem: Deinstallieren Sie die Anwendung auf dem Gerät und installieren Sie die Anwendung über reaktionsnatives Run-Android neu
Danach ist das Problem weg

Übrigens verwende ich keine underlineColorAndroid-Requisiten, daher funktioniert es nicht, was auch immer ich für diese Requisiten festgelegt oder deaktiviert habe

Dies geschieht zufällig, wenn Sie einige Texteingaben in einer Bildlaufansicht verwenden. underlineColorAndroid wird immer verwendet, da es standardmäßig festgelegt ist .

Ist mir auch heute auf der Expo passiert.

Wenn Sie auf der Expo sind, müssen Sie den Expo-Server, Ihre App und die Expo-App vollständig schließen. Und wieder öffnen.

Andernfalls würde der Fehler nicht verschwinden.

Ist mir auf der Expo passiert.

Aus irgendeinem Grund gab es zwei Instanzen meiner App im Hintergrund. Als ich auf die Android-Quadrat-Schaltfläche "Übersicht" klickte, um Apps im Speicher anzuzeigen, sah ich diese beiden Instanzen meiner App. Als ich sie schloss und die App erneut ausführte, wurde dieser Fehler nicht mehr angezeigt.

Also, wie die Jungs schon sagten, alles schließen und wieder laufen sollte es reparieren

Ich habe 3 Stunden lang versucht, diesen Fehler ohne Ergebnis herauszufinden, dann habe ich meine App auf meinem Android-Emulator neu installiert und der Fehler ist verschwunden.

Versuchen Sie 0,59,4, um festzustellen, ob dieser Absturz immer noch auftritt.

@sunnylqm Immer noch auf 0,59,5.

Android: 8.0.0
Android Build: R16NW
Manufacturer: samsung
Model: SM-G955F

java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
  at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875)
  at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158)
  at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433)
  at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258)
  at android.view.View.computeOpaqueFlags(View.java:16791)
  at android.view.View.setBackgroundDrawable(View.java:21710)
  at android.view.View.setBackground(View.java:21603)
  at android.view.View.<init>(View.java:5547)
  at android.widget.TextView.<init>(TextView.java:1135)
  at android.widget.EditText.<init>(EditText.java:107)
  at android.widget.EditText.<init>(EditText.java:103)
  at android.widget.EditText.<init>(EditText.java:99)
  at android.widget.EditText.<init>(EditText.java:95)
  at com.facebook.react.views.textinput.c.<init>
  at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance
  at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance
  at com.facebook.react.uimanager.ViewManager.createView
  at com.facebook.react.uimanager.k.a
  at com.facebook.react.uimanager.aq$e.a
  at com.facebook.react.uimanager.aq$h.c
  at com.facebook.react.uimanager.aq$h.a
  at com.facebook.react.uimanager.e.b
  at com.facebook.react.modules.core.e$b.b
  at com.facebook.react.modules.core.a$a$1.doFrame
  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:909)
  at android.view.Choreographer.doCallbacks(Choreographer.java:723)
  at android.view.Choreographer.doFrame(Choreographer.java:655)
  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
  at android.os.Handler.handleCallback(Handler.java:789)
  at android.os.Handler.dispatchMessage(Handler.java:98)
  at android.os.Looper.loop(Looper.java:164)
  at android.app.ActivityThread.main(ActivityThread.java:6938)
  at java.lang.reflect.Method.invoke(Method.java:-2)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

Ich habe diesen Fehler mit einer Komponente, die mehrere TextInputs rendert.
Wenn ich den Build oder die App neu starte, geht es und es kommt zurück, wenn ich zum zweiten Mal erneut rendere.

Android: 9
Telefon: SAMSUNG Galaxy Note 9
Modell: SM-N960F / DS
reaktionsnative Version "0.58.5"

Versuchen Sie, die virtuelle Methode 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawable (android.content.res.Resources)' für eine Nullobjektreferenz aufzurufen
createAllFutures
DrawableContainer. Java: 875
getOpacity
DrawableContainer. Java: 1158
getOpacity
DrawableContainer. Java: 433
getOpacity
InsetDrawable. Java: 258
computeOpaqueFlags
Aussicht. Java: 18165
setBackgroundDrawable
Aussicht. Java: 23335
Hintergrund einstellen
Aussicht. Java: 23228

Aussicht. Java: 5952

Textvorschau. Java: 1108

Text bearbeiten. Java: 106

Text bearbeiten. Java: 102

Text bearbeiten. Java: 98

Text bearbeiten. Java: 94
setThemedContext
ReactTextInputShadowNode. Java: 73
createView
UIImplementation. Java: 288
createView
UIManagerModule. Java: 449
aufrufen
Method.java
aufrufen
JavaMethodWrapper. Java: 372
aufrufen
JavaModuleWrapper. Java: 158
Lauf
NativeRunnable.java
handleCallback
Handler. Java: 873
dispatchMessage
Handler. Java: 99
dispatchMessage
MessageQueueThreadHandler. Java: 29
Schleife
Looper. Java: 214
Lauf
MessageQueueThreadImpl. Java: 192
Lauf
Faden. Java: 764

Ich habe auch das gleiche Problem auf Samsung Note 8, Android Version 9 und React native 0.57.0

Gleiches Problem hier. React Native 0.59.0. Das Problem tritt bei der Verwendung der App nur zufällig auf. Es konnte kein Muster dafür angezeigt werden. Passiert sowohl im Entwicklungsmodus als auch in der Produktion.

Dieses Problem hat dazu geführt, dass unsere App auch in der Produktion abstürzt. Es ist ein böser Fehler, weil es wirklich schwierig ist, ihn zu reproduzieren. Wir haben eine vielversprechende Lösung für unsere App gefunden und ich möchte unsere Ergebnisse hier teilen, um anderen hoffentlich Zeit und Frust zu ersparen.

Technische Daten und Versionen

Dieser Fehler hat dazu geführt, dass unsere App auf Samsung-, Google- und LG-Android-Geräten abstürzt. Wir haben Absturzberichte von folgenden Android-Versionen erhalten:

  • 8.0.0
  • 8.1.0
  • 7.1.1

Unsere App läuft:

  • react-native : 0.53.0
  • react : 16.2.0

Was verursacht den Absturz?

Wie andere in diesem Thread bemerkt haben, scheint das Problem durch das Rendern einer Kombination aus TextInput , FlatList und ScrollView Komponenten ausgelöst zu werden. In unserem Fall haben wir einen Bildschirm mit einem einzelnen TextInput der über einem FlatList gerendert wird. Wenn eines der Elemente in FlatList getippt wird, navigiert die App zu einem neuen Bildschirm mit einem Formular. Die Stammkomponente dieses Formulars ist eine ScrollView , die eine Reihe von TextInput -Komponenten enthält (zusammen mit einigen Schaltflächen und anderen benutzerdefinierten Komponenten). Unsere App stürzt ab, wenn der Benutzer auf eines dieser FlatList -Elemente tippt (beachten Sie, dass dies nicht jedes Mal passiert).

Es ist schwierig, dieses Problem zu reproduzieren. Tatsächlich konnten wir dies nicht tun. Wir wissen jedoch, dass der Absturz an diesem Punkt im Workflow auftritt, indem wir unsere Appsee-Sitzungsaufzeichnungen ansehen.

Da wir das Problem nicht reproduzieren können, mussten wir uns beim Debuggen auf die Absturzprotokolle von Appsee verlassen. Ich habe den Stack-Trace aus den folgenden Absturzberichten kopiert (und einige verrauschte Abschnitte weggelassen). Es ist mehr oder weniger identisch mit den Stapelspuren, die andere in diesem Thread gepostet haben:

0     java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
1     at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875)
2     at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158)
3     at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433)
4     at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258)
5     at android.view.View.computeOpaqueFlags(View.java:16900)
6     at android.view.View.setBackgroundDrawable(View.java:21824)
7     at android.view.View.setBackground(View.java:21717)
8     at android.view.View.<init>(View.java:5577)
9     at android.widget.TextView.<init>(TextView.java:1144)
...
13    at android.widget.EditText.<init>(EditText.java:96)
14    at com.facebook.react.views.textinput.ReactEditText.<init>(ReactEditText.java:91)
15    at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:91)
16    at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:61)
...
35    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

Quelle des Problems

Nachdem ich diesen Thread gelesen und ein paar Stunden recherchiert hatte, fand ich den underlineColorAndroid Prop-Handler in der ReactTextInputManager.java -Datei:

@ReactProp(name = "underlineColorAndroid", customType = "Color")
public void setUnderlineColor(ReactEditText view, <strong i="42">@Nullable</strong> Integer underlineColor) {
  // Drawable.mutate() can sometimes crash due to an AOSP bug:
  // See https://code.google.com/p/android/issues/detail?id=191754 for more info
  Drawable background = view.getBackground();
  Drawable drawableToMutate = background.getConstantState() != null ?
    background.mutate() :
    background;

  if (underlineColor == null) {
    drawableToMutate.clearColorFilter();
  } else {
    drawableToMutate.setColorFilter(underlineColor, PorterDuff.Mode.SRC_IN);
  }
}

Der im Kommentar verlinkte Fehlerbericht enthält den folgenden Stack-Trace:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable()' on a null object reference
    at android.graphics.drawable.LayerDrawable$ChildDrawable.<init>(LayerDrawable.java:1723)
    at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:1792)
    at android.graphics.drawable.LayerDrawable.createConstantState(LayerDrawable.java:152)
    at android.graphics.drawable.LayerDrawable.mutate(LayerDrawable.java:1652)

Dies entspricht der Stapelverfolgung, auf die wir in unserer App stoßen. Ich gebe nicht vor, das zugrunde liegende Problem vollständig zu verstehen, aber es ist wahrscheinlich, dass die Ursache für den Absturz unserer App in der Produktion darin liegt, dass der Fehler Drawable.mutate() ausgelöst wird. Dies geschieht, wenn wir versuchen, die underlineColorAndroid -Stütze für unsere TextInput -Komponente festzulegen (und daher die ReactTextInputManager.setUnderlineColor -Methode aufzurufen).

Unsere App hat mit den folgenden Requisiten ein TextInput gerendert, von denen eines underlineColorAndroid="transparent" :

<TextInput
  ref={this.handleRef}
  value={this.props.value}
  autoCorrect={false}
  autoCapitalize="none"
  underlineColorAndroid="transparent"
  onSubmitEditing={this.handleSubmit}
  onChangeText={this.props.onChangeText}
  onFocus={this.handleFocused}
  onBlur={this.handleBlur}
  clearButtonMode="always"
/>

Wie wir es behoben haben

Wir mussten diese Requisite einstellen, um die Unterstreichung aus den TextInput -Komponenten in unserer App zu entfernen. Basierend auf unseren Erkenntnissen schien der Prop-Handler jedoch einen Android-Fehler auszulösen, der gelegentlich zum Absturz der App führte.

Glücklicherweise gibt es eine andere Möglichkeit, Unterstreichungen von TextInput -Komponenten unter Android zu entfernen. Sie können der Datei android/app/src/main/res/values/styles.xml eine Zeile hinzufügen:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowExitAnimation"><strong i="65">@android</strong>:anim/fade_out</item>
        <item name="android:windowBackground">@drawable/splash_screen</item>
+       <item name="android:editTextBackground"><strong i="66">@android</strong>:color/transparent</item>
    </style>
</resources>

Beachten Sie, dass ich auch die folgenden Vorschläge gesehen habe, aber dies hat die Unterstreichungen für uns nicht entfernt:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowExitAnimation"><strong i="71">@android</strong>:anim/fade_out</item>
        <item name="android:windowBackground">@drawable/splash_screen</item>
    </style>

+   <!-- This did *not* work for us... -->
+   <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
+     <item name="android:background"><strong i="72">@android</strong>:color/transparent</item>
+   </style>
</resources>

Damit wird das zugrunde liegende Problem nicht behoben. Es ist nur eine Problemumgehung, bei der die Verwendung der underlineColorAndroid -Stütze für TextInput -Komponenten vermieden wird.

Ich kann noch nicht mit Sicherheit sagen, dass dies tatsächlich funktioniert, da ich das Problem nicht lokal reproduzieren konnte. Wir werden diese Änderung in den kommenden Wochen in einem Update für unsere App bereitstellen. Danach müssen wir eine Weile warten, um zu sehen, ob es nicht mehr auftritt. Ich werde versuchen, mit unseren Ergebnissen zu berichten.

Viel Glück für alle, die mit diesem frustrierenden Thema ringen! Ich hoffe das hilft.

Ich weiß, wie ich diese Situation reproduzieren kann. Klicken Sie wie gesagt in das Formular zurück und dann auf Element in der Flatlist, um das Formular aufzurufen. Wiederholen Sie diesen Fehler ungefähr zehnmal und etwas schneller. Sie können den Fehler gemäß meinen Angaben reproduzieren.

@ Hopding
Ich weiß, wie ich diese Situation reproduzieren kann. Klicken Sie wie gesagt in das Formular zurück und dann auf Element in der Flatlist, um das Formular aufzurufen. Wiederholen Sie diesen Fehler ungefähr zehnmal und etwas schneller. Sie können den Fehler gemäß meinen Angaben reproduzieren.

@ Hopding
Ich habe underlineColorAndroid entfernt, aber ich werde es reproduzieren.

@ React-Native-Bot Dieses Problem ist sehr wichtig

Ich benutze RN 59.5 und habe auch dieses Problem ..

Versuchen Sie, die virtuelle Methode 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawable (android.content.res.Resources)' für eine Nullobjektreferenz aufzurufen
createAllFutures
DrawableContainer. Java: 875
getOpacity
DrawableContainer. Java: 1158
getOpacity
DrawableContainer. Java: 433
getOpacity
InsetDrawable. Java: 258
computeOpaqueFlags
Aussicht. Java: 16594
setBackgroundDrawable
Aussicht. Java: 21577
Hintergrund einstellen
Aussicht. Java: 21470

Aussicht. Java: 5498

Textvorschau. Java: 875

Text bearbeiten. Java: 88

Text bearbeiten. Java: 84

Text bearbeiten. Java: 80

Text bearbeiten. Java: 76
setThemedContext
ReactTextInputShadowNode. Java: 76
createView
UIImplementation. Java: 294
createView
UIManagerModule. Java: 462
aufrufen
Method.java
aufrufen
JavaMethodWrapper. Java: 372
aufrufen
JavaModuleWrapper. Java: 158
Lauf
NativeRunnable.java
handleCallback
Handler. Java: 873
dispatchMessage
Handler. Java: 99
dispatchMessage
MessageQueueThreadHandler. Java: 29
Schleife
Looper. Java: 193
Lauf
MessageQueueThreadImpl. Java: 232
Lauf
Faden. Java: 764

Hat jemand das schon gelöst ?? Ich bin mit diesem Problem in RN 52, ich habe auf 56 aktualisiert, aber immer noch der Fehler. Ich habe die Schritte versucht, um es zu reproduzieren, aber ich kann nicht. Einige Geräte feuern dies immer noch zufällig ab.

Haben Sie Glück mit diesem Problem?

Ich bekomme dieses Problem RN 0.59.5

Dieses Problem hat dazu geführt, dass unsere App auch in der Produktion abstürzt. Es ist ein böser Fehler, weil es wirklich schwierig ist, ihn zu reproduzieren. Wir haben eine vielversprechende Lösung für unsere App gefunden und ich möchte unsere Ergebnisse hier teilen, um anderen hoffentlich Zeit und Frust zu ersparen.

Technische Daten und Versionen

Dieser Fehler hat dazu geführt, dass unsere App auf Samsung-, Google- und LG-Android-Geräten abstürzt. Wir haben Absturzberichte von folgenden Android-Versionen erhalten:

  • 8.0.0
  • 8.1.0
  • 7.1.1

Unsere App läuft:

  • react-native : 0.53.0
  • react : 16.2.0

Was verursacht den Absturz?

Wie andere in diesem Thread bemerkt haben, scheint das Problem durch das Rendern einer Kombination aus TextInput , FlatList und ScrollView Komponenten ausgelöst zu werden. In unserem Fall haben wir einen Bildschirm mit einem einzelnen TextInput der über einem FlatList gerendert wird. Wenn eines der Elemente in FlatList getippt wird, navigiert die App zu einem neuen Bildschirm mit einem Formular. Die Stammkomponente dieses Formulars ist eine ScrollView , die eine Reihe von TextInput -Komponenten enthält (zusammen mit einigen Schaltflächen und anderen benutzerdefinierten Komponenten). Unsere App stürzt ab, wenn der Benutzer auf eines dieser FlatList -Elemente tippt (beachten Sie, dass dies nicht jedes Mal passiert).
Es ist schwierig, dieses Problem zu reproduzieren. Tatsächlich konnten wir dies nicht tun. Wir wissen jedoch, dass der Absturz an diesem Punkt im Workflow auftritt, indem wir unsere Appsee-Sitzungsaufzeichnungen ansehen.
Da wir das Problem nicht reproduzieren können, mussten wir uns beim Debuggen auf die Absturzprotokolle von Appsee verlassen. Ich habe den Stack-Trace aus den folgenden Absturzberichten kopiert (und einige verrauschte Abschnitte weggelassen). Es ist mehr oder weniger identisch mit den Stapelspuren, die andere in diesem Thread gepostet haben:

0   java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
1   at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875)
2   at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158)
3   at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433)
4   at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258)
5   at android.view.View.computeOpaqueFlags(View.java:16900)
6   at android.view.View.setBackgroundDrawable(View.java:21824)
7   at android.view.View.setBackground(View.java:21717)
8   at android.view.View.<init>(View.java:5577)
9   at android.widget.TextView.<init>(TextView.java:1144)
...
13  at android.widget.EditText.<init>(EditText.java:96)
14  at com.facebook.react.views.textinput.ReactEditText.<init>(ReactEditText.java:91)
15  at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:91)
16  at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:61)
...
35  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

Quelle des Problems

Nachdem ich diesen Thread gelesen und ein paar Stunden recherchiert hatte, fand ich den underlineColorAndroid Prop-Handler in der ReactTextInputManager.java -Datei:

@ReactProp(name = "underlineColorAndroid", customType = "Color")
public void setUnderlineColor(ReactEditText view, <strong i="43">@Nullable</strong> Integer underlineColor) {
  // Drawable.mutate() can sometimes crash due to an AOSP bug:
  // See https://code.google.com/p/android/issues/detail?id=191754 for more info
  Drawable background = view.getBackground();
  Drawable drawableToMutate = background.getConstantState() != null ?
    background.mutate() :
    background;

  if (underlineColor == null) {
    drawableToMutate.clearColorFilter();
  } else {
    drawableToMutate.setColorFilter(underlineColor, PorterDuff.Mode.SRC_IN);
  }
}

Der im Kommentar verlinkte Fehlerbericht enthält den folgenden Stack-Trace:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable()' on a null object reference
    at android.graphics.drawable.LayerDrawable$ChildDrawable.<init>(LayerDrawable.java:1723)
    at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:1792)
    at android.graphics.drawable.LayerDrawable.createConstantState(LayerDrawable.java:152)
    at android.graphics.drawable.LayerDrawable.mutate(LayerDrawable.java:1652)

Dies entspricht der Stapelverfolgung, auf die wir in unserer App stoßen. Ich gebe nicht vor, das zugrunde liegende Problem vollständig zu verstehen, aber es ist wahrscheinlich, dass die Ursache für den Absturz unserer App in der Produktion darin liegt, dass der Fehler Drawable.mutate() ausgelöst wird. Dies geschieht, wenn wir versuchen, die underlineColorAndroid -Stütze für unsere TextInput -Komponente festzulegen (und daher die ReactTextInputManager.setUnderlineColor -Methode aufzurufen).
Unsere App hat mit den folgenden Requisiten ein TextInput gerendert, von denen eines underlineColorAndroid="transparent" :

<TextInput
  ref={this.handleRef}
  value={this.props.value}
  autoCorrect={false}
  autoCapitalize="none"
  underlineColorAndroid="transparent"
  onSubmitEditing={this.handleSubmit}
  onChangeText={this.props.onChangeText}
  onFocus={this.handleFocused}
  onBlur={this.handleBlur}
  clearButtonMode="always"
/>

Wie wir es behoben haben

Wir mussten diese Requisite einstellen, um die Unterstreichung aus den TextInput -Komponenten in unserer App zu entfernen. Basierend auf unseren Erkenntnissen schien der Prop-Handler jedoch einen Android-Fehler auszulösen, der gelegentlich zum Absturz der App führte.
Glücklicherweise gibt es eine andere Möglichkeit, Unterstreichungen von TextInput -Komponenten unter Android zu entfernen. Sie können der Datei android/app/src/main/res/values/styles.xml eine Zeile hinzufügen:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowExitAnimation"><strong i="66">@android</strong>:anim/fade_out</item>
        <item name="android:windowBackground">@drawable/splash_screen</item>
+       <item name="android:editTextBackground"><strong i="67">@android</strong>:color/transparent</item>
    </style>
</resources>

Beachten Sie, dass ich auch die folgenden Vorschläge gesehen habe, aber dies hat die Unterstreichungen für uns nicht entfernt:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowExitAnimation"><strong i="72">@android</strong>:anim/fade_out</item>
        <item name="android:windowBackground">@drawable/splash_screen</item>
    </style>

+   <!-- This did *not* work for us... -->
+   <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
+     <item name="android:background"><strong i="73">@android</strong>:color/transparent</item>
+   </style>
</resources>

Damit wird das zugrunde liegende Problem nicht behoben. Es ist nur eine Problemumgehung, bei der die Verwendung der underlineColorAndroid -Stütze für TextInput -Komponenten vermieden wird.
Ich kann noch nicht mit Sicherheit sagen, dass dies tatsächlich funktioniert, da ich das Problem nicht lokal reproduzieren konnte. Wir werden diese Änderung in den kommenden Wochen in einem Update für unsere App bereitstellen. Danach müssen wir eine Weile warten, um zu sehen, ob es nicht mehr auftritt. Ich werde versuchen, mit unseren Ergebnissen zu berichten.
Viel Glück für alle, die mit diesem frustrierenden Thema ringen! Ich hoffe das hilft.

Ich weiß, wie ich diese Situation reproduzieren kann. Klicken Sie wie gesagt in das Formular zurück und dann auf Element in der Flatlist, um das Formular aufzurufen. Wiederholen Sie diesen Fehler ungefähr zehnmal und etwas schneller. Sie können den Fehler gemäß meinen Angaben reproduzieren.

Scheint so, als würde dies das Problem beheben.

Für diejenigen, die sich fragen, wie man reproduziert: Wir haben es reproduziert, indem wir 100 <TextInput ...> zu einem <ScrollView ...> hinzugefügt haben. Zu diesem Zeitpunkt konnten wir den Fehler mit einer geschätzten Erfolgsrate von 75% bis 90% reproduzieren. Genug, um Lösungen auszuprobieren. 50 Felder waren nicht genug.

@Hopding ‚s Abhilfe für uns gearbeitet. Die vorgeschlagene alternative "Farbton" -Lösung (von anderen) funktioniert nicht. Der unglückliche Nebeneffekt der Problemumgehung besteht darin, dass die Texteingaben nicht mehr aufgefüllt werden.

Hier gilt das gleiche.

Schwerwiegende Ausnahme: java.lang.NullPointerException: Versuch, die virtuelle Methode 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawable (android.content.res.Resources)' für eine Nullobjektreferenz aufzurufen
at android.graphics.drawable.DrawableContainer $ DrawableContainerState.createAllFutures (DrawableContainer.java:875)
at android.graphics.drawable.DrawableContainer $ DrawableContainerState.getOpacity (DrawableContainer.java:1158)
at android.graphics.drawable.DrawableContainer.getOpacity (DrawableContainer.java:433)
at android.graphics.drawable.InsetDrawable.getOpacity (InsetDrawable.java:258)
at android.view.View.computeOpaqueFlags (View.java:18188)
bei android.view.View.setBackgroundDrawable (View.java:23358)
bei android.view.View.setBackground (View.java:23251)
bei android.view.View.(View.java:5948)
bei android.widget.TextView.(TextView.java:1118)
bei android.widget.EditText.(EditText.java:106)
bei android.widget.EditText.(EditText.java:102)
bei android.widget.EditText.(EditText.java:98)
bei android.widget.EditText.(EditText.java:94)
unter com.facebook.react.views.textinput.ReactEditText.(ReactEditText.java:89)
unter com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance (ReactTextInputManager.java:105)
unter com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance (ReactTextInputManager.java:65)
unter com.facebook.react.uimanager.ViewManager.createView (ViewManager.java:47)
unter com.facebook.react.uimanager.NativeViewHierarchyManager.createView (NativeViewHierarchyManager.java:256)
at com.facebook.react.uimanager.UIViewOperationQueue $ CreateViewOperation.execute (UIViewOperationQueue.java:200)
at com.facebook.react.uimanager.UIViewOperationQueue $ DispatchUIFrameCallback.dispatchPendingNonBatchedOperations (UIViewOperationQueue.java:1109)
at com.facebook.react.uimanager.UIViewOperationQueue $ DispatchUIFrameCallback.doFrameGuarded (UIViewOperationQueue.java:1080)
unter com.facebook.react.uimanager.GuardedFrameCallback.doFrame (GuardedFrameCallback.java:29)
at com.facebook.react.modules.core.ReactChoreographer $ ReactChoreographerDispatcher.doFrame (ReactChoreographer.java:166)
at com.facebook.react.modules.core.ChoreographerCompat $ FrameCallback $ 1.doFrame (ChoreographerCompat.java:84)
at android.view.Choreographer $ CallbackRecord.run (Choreographer.java:947)
at android.view.Choreographer.doCallbacks (Choreographer.java:761)
at android.view.Choreographer.doFrame (Choreographer.java:693)
at android.view.Choreographer $ FrameDisplayEventReceiver.run (Choreographer.java:935)
bei android.os.Handler.handleCallback (Handler.java:873)
bei android.os.Handler.dispatchMessage (Handler.java:99)
bei android.os.Looper.loop (Looper.java:214)
bei android.app.ActivityThread.main (ActivityThread.java:7045)
bei java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:493)
bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:965)

image

eine Problemumgehung?

Hier ist ein Code, in dem der Fehler RN 0.59.8 reproduziert wird

> import React, { Component } from 'react';
> import { StyleSheet, Text, View, TextInput, FlatList, TouchableOpacity } from 'react-native';
> 
> export default class App extends Component {
>   state = { Valor: [] }
>   componentDidMount() {
>     for (i = 0; i < 90000; i++) {
>       var te = { ID: i }
>       this.state.Valor.push(te)
>     }
>   }
> 
>   keyExtractor = (item, index) => item.ID.toString();
>   renderList = () => {
>     return (
>       <FlatList
>         keyExtractor={this.keyExtractor}
>         data={this.state.Valor}
>         renderItem={({ item }) => (
>           <TouchableOpacity
>             activeOpacity={0.5}
>             onPress={() => alert("hola")} >
>             <View style={{ flex: 1 }}>
>               <Text>Muestra</Text>
>               <TextInput
>                 underlineColorAndroid={"transparent"}
>                 placeholder={"Ingrese"}
>                 keyboardType="phone-pad"
>               />
>             </View>
>           </TouchableOpacity>
>         )}
>       >
>       </FlatList>
>     );
>   };
> 
>   render() {
>     return (
>       <View style={styles.container}>
>         {this.renderList()}
>       </View>
>     );
>   }
> }
> 
> const styles = StyleSheet.create({
>   container: {
>     flex: 1,
>     justifyContent: 'flex-start',
>     alignItems: 'flex-start',
>     backgroundColor: '#F5FCFF',
>   },
>   welcome: {
>     fontSize: 20,
>     textAlign: 'center',
>     margin: 10,
>   },
>   instructions: {
>     textAlign: 'center',
>     color: '#333333',
>     marginBottom: 5,
>   }
> });
> 

Video: https://www.youtube.com/watch?v=FJ6YvXrevMQ&feature=youtu.be

Lösung plz.

Diese Ausgabe wurde am 11. Januar 2018 eröffnet und es ist jetzt Mai 2019, warum spricht niemand vom offiziellen Team sie an?
Zu Ihrer Information, die Problemumgehungen funktionieren nicht.

Gleich hier 0.59.6

Schwerwiegende Ausnahme: java.lang.NullPointerException: Versuch, die virtuelle Methode 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawable (android.content.res.Resources)' für eine Nullobjektreferenz aufzurufen
at android.graphics.drawable.DrawableContainer $ DrawableContainerState.createAllFutures (DrawableContainer.java:875)
at android.graphics.drawable.DrawableContainer $ DrawableContainerState.getOpacity (DrawableContainer.java:1158)
at android.graphics.drawable.DrawableContainer.getOpacity (DrawableContainer.java:433)
at android.graphics.drawable.InsetDrawable.getOpacity (InsetDrawable.java:258)
at android.view.View.computeOpaqueFlags (View.java:18188)
bei android.view.View.setBackgroundDrawable (View.java:23358)
bei android.view.View.setBackground (View.java:23251)
bei android.view.View. (View.java:5948)
bei android.widget.TextView. (TextView.java:1118)
at android.widget.EditText. (EditText.java:106)
at android.widget.EditText. (EditText.java:102)
at android.widget.EditText. (EditText.java:98)
bei android.widget.EditText. (EditText.java:94)
at com.facebook.react.views.textinput.ReactEditText. (ReactEditText.java:89)
unter com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance (ReactTextInputManager.java:105)
unter com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance (ReactTextInputManager.java:65)
unter com.facebook.react.uimanager.ViewManager.createView (ViewManager.java:47)
unter com.facebook.react.uimanager.NativeViewHierarchyManager.createView (NativeViewHierarchyManager.java:256)
at com.facebook.react.uimanager.UIViewOperationQueue $ CreateViewOperation.execute (UIViewOperationQueue.java:200)
at com.facebook.react.uimanager.UIViewOperationQueue $ DispatchUIFrameCallback.dispatchPendingNonBatchedOperations (UIViewOperationQueue.java:1109)
at com.facebook.react.uimanager.UIViewOperationQueue $ DispatchUIFrameCallback.doFrameGuarded (UIViewOperationQueue.java:1080)
unter com.facebook.react.uimanager.GuardedFrameCallback.doFrame (GuardedFrameCallback.java:29)
at com.facebook.react.modules.core.ReactChoreographer $ ReactChoreographerDispatcher.doFrame (ReactChoreographer.java:166)
at com.facebook.react.modules.core.ChoreographerCompat $ FrameCallback $ 1.doFrame (ChoreographerCompat.java:84)
at android.view.Choreographer $ CallbackRecord.run (Choreographer.java:947)
at android.view.Choreographer.doCallbacks (Choreographer.java:761)
at android.view.Choreographer.doFrame (Choreographer.java:693)
at android.view.Choreographer $ FrameDisplayEventReceiver.run (Choreographer.java:935)
bei android.os.Handler.handleCallback (Handler.java:873)
bei android.os.Handler.dispatchMessage (Handler.java:99)
bei android.os.Looper.loop (Looper.java:214)
bei android.app.ActivityThread.main (ActivityThread.java:7045)
bei java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:493)
bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:965)

bug_react

@knspatel Unsere

Lassen Sie mich noch einmal zusammenfassen:
Der entscheidende Punkt ist, nirgendwo einen Wert auf underlineColorAndroid zu setzen . Da jedoch 0,57 underlineColorAndroid standardmäßig festgelegt ist , müssen Sie diese Zeile manuell über ein Patch-Tool wie das Patch-Paket entfernen.
Und wenn Sie die Unterstreichung dennoch unsichtbar machen möchten, müssen Sie sie in einer XML-Konfiguration festlegen.


Und hier sind einige Informationen, die ich bisher gefunden habe:
Ein chinesischer Blog (kann Google Übersetzer ausprobieren, wenn Sie nicht lesen können) erwähnte ein sehr ähnliches Problem wie dieses. Es heißt, dass eine benutzerdefinierte zeichnbare Klasse ohne Implementierung von getConstantState in einigen Szenarien zum Absturz führen kann.

Ich habe festgestellt, dass manchmal der Texteingang (ReactEditText) neu erstellt wird (mehr Texteingaben, mehr Möglichkeiten, Art des Recyclings?) Und wieder setBackground , der dann zu https://github.com/aosp-mirror/ wechselt. platform_frameworks_base / blob / master / graphics / java / android / graphics / drawable / DrawableContainer.java # L922 , wobei ConstantState null ist.

Die einzige benutzerdefinierte Zeichenklasse, die ich gefunden habe, ist ReactViewBackgroundDrawable, und es wurde kein getConstantState implementiert, das standardmäßig null zurückgibt.
Ich habe versucht, es mit einer leeren Klasse zu überschreiben, und es kann einen Unterschied machen (dieser Absturz verschwindet, während andere auftauchen).

Hoffe, dies kann jemandem helfen, mehr zu graben.

Ich fand manuelles Testen sehr erfolgreich und schrieb eine Komponente, um einige der oben beschriebenen Szenarien automatisch zu testen. Sie finden die Komponente unten. Sie müssen es nur irgendwo rendern, damit es seine Arbeit erledigt.

Dabei stellte ich fest, dass Sie dem AppTheme in styles.xml nur Folgendes hinzufügen müssen, wie von @Hopding vorgeschlagen
<item name="android:editTextBackground"><strong i="7">@android</strong>:color/transparent</item>

Es war nichts anderes erforderlich, und es gab keine Notwendigkeit, das Setzen von underlineColorAndroid zu vermeiden. Es war also egal, dass React Native es jetzt standardmäßig festlegt.

Der Hauptnachteil dieses Fixes besteht darin, dass Sie Ihre TextInputs neu formatieren müssen, um den daraus resultierenden Verlust an Polsterung zu berücksichtigen, und Sie verlieren auch das tatsächliche Unterstreichungsverhalten, was für uns von Vorteil war, da wir es immer als "transparent" festgelegt haben. mit iOS konsistent sein. Wenn Sie es brauchen, können Sie eine Wrapper-Komponente erstellen, die onFocus und onBlur und Ihre eigene Unterstreichung erstellt.

Meine Version von React Native ist 0.57.3

Hier sind einige andere Dinge, die ich mit meiner Testkomponente gefunden habe:

  1. Ich konnte den Absturz auf meinem Android-Tablet mit niedriger Spezifikation überhaupt nicht verursachen. Die Reproduktion war jedoch auf meinem Samsung S6 Edge-Telefon mit Android 7 recht einfach. Ich vermute, dass es eine Rennbedingung gibt, für die ein schnelleres Gerät erforderlich ist, um sie zu provozieren.
  2. Das Scrollen der Texteingaben machte keinen Unterschied, und ich konnte das Problem problemlos reproduzieren, ohne eine ScrollView zu verwenden.
  3. Die Eingabe von Text war nicht erforderlich. Das einfache Ändern des Fokus reichte aus, um den Absturz zu verursachen.
  4. Es machte keinen Unterschied, auf welche Farbe Sie die Unterstreichung setzen, selbst undefined verursachte den Absturz, aber Sie würden das vielleicht erwarten, da RN jetzt standardmäßig "transparent" ist.
  5. Die gleichzeitige Anzeige einer angemessenen Anzahl von TextInputs machte einen Unterschied, da der Absturz mit 100 schneller ablief als nur 10 auf dem Bildschirm.
  6. Ich konnte den Absturz nicht mit displayForMs: 0 reproduzieren, was darauf hindeutet, dass er nur auftritt, wenn die TextInputs erst kürzlich erstellt wurden.

Wenn Sie beim Testen nicht herumhängen möchten, können Sie die Ausgabe von adb logcat erfassen und nach den von der Komponente und dem Absturzbericht erzeugten Konsolenmeldungen suchen.

Hier ist meine Testkomponente, falls Sie sie verwenden möchten. Die Testparameter sind so eingestellt, dass sie in weniger als 30 Sekunden einen Absturz verursachen.

/**
 * A test component to reproduce the crash reported at
 * https://github.com/facebook/react-native/issues/17530
 */

import * as React from "react";
import { View, ScrollView, TextInput, Text, StyleSheet } from "react-native";

// These are the test parameters
const params = {
  underlineColors: ["red", undefined, "transparent", "rgba(0, 0, 0, 0)"],  // The colors to test
  numberOfInputs: 100, // How many TextInput to render at a time
  focusIntervalMs: 200, // How often to change focus between them
  displayForMs: 3000, // How long to display them (set to 0 for indefinite)
  delayDisplayForMs: 10, // How long to delay between displays
  withScrollView: false // Whether to use a ScrollView
};

const testText = index =>
  `Testing underlineColor = ${params.underlineColors[index] || "undefined"}`;

class AndroidTextInputTest extends React.Component{
  state = {
    underlineColorIndex: 0,
    showInputs: true,
    startKey: 0
  };
  mounted = false;
  focusInterval = undefined;
  textInputRefs = undefined;
  focussedInputIndex = 0;

  componentDidMount() {
    console.log(`Testing with params = `, JSON.stringify(params));
    this.mounted = true;
    setTimeout(this._showInputs, params.delayDisplayForMs);
    setInterval(this._focusAnInput, params.focusIntervalMs);
  }

  componentWillUnmount() {
    clearInterval(this.focusInterval);
    this.mounted = false;
  }

  _focusAnInput = () => {
    if (this.mounted && this.textInputRefs) {
      if (this.focussedInputIndex >= this.textInputRefs.length) {
        this.focussedInputIndex = 0;
      }
      const textInputRef = this.textInputRefs[this.focussedInputIndex];
      const textInput = this.refs[textInputRef];
      if (textInput) {
        this.focussedInputIndex++;
        this.refs[textInputRef].focus();
      }
    }
  };

  _showInputs = () => {
    if (this.mounted) {
      console.log(testText(this.state.underlineColorIndex));
      this.setState({ showInputs: true });
      if (params.displayForMs) {
        setTimeout(this._unshowInputs, params.displayForMs);
      }
    }
  };

  _unshowInputs = () => {
    this.focussedInputIndex = 0;
    this.textInputRefs = undefined;
    if (this.mounted) {
      let next = this.state.underlineColorIndex + 1;
      if (next === params.underlineColors.length) {
        next = 0;
      }
      this.setState({
        underlineColorIndex: next,
        showInputs: false,
        startKey: this.state.startKey + params.numberOfInputs
      });
      setTimeout(this._showInputs, params.delayDisplayForMs);
    }
  };

  render() {
    const textInputs = [];
    const { underlineColorIndex } = this.state;
    const underlineColor = params.underlineColors[underlineColorIndex];

    const refs = [];

    if (this.state.showInputs) {
      for (let i = 0; i < params.numberOfInputs; i++) {
        const key = this.state.startKey + i + "";
        refs.push(key);
        textInputs.push(
          <TextInput
            ref={key}
            key={key}
            placeholder={key}
            underlineColorAndroid={underlineColor}
            style={styles.textInput}
          />
        );
      }
      if (!this.textInputRefs) {
        this.textInputRefs = refs;
      }
    }

    return (
      <View style={styles.mainView}>
        <Text>{testText(underlineColorIndex)}</Text>
        {params.withScrollView ? (
          <React.Fragment>
            <Text>With ScrollView</Text>
            <ScrollView>{textInputs}</ScrollView>
          </React.Fragment>
        ) : (
          <React.Fragment>{textInputs}</React.Fragment>
        )}
      </View>
    );
  }
}

const styles = StyleSheet.create({
  mainView: {
    flex: 1,
    alignItems: "center"
  },
  textInput: {
    backgroundColor: "white",
    margin: 5,
    width: 300
  }
});

export default AndroidTextInputTest;

Für alle, die nach einer Lösung suchen, kann ich diese Einstellung auch bestätigen@android : Farbe / transparent in styles.xml wurde das Problem behoben.

Zu Ihrer Information: Wir verwenden React-Native Paper und dessen TextInput-Komponente und konnten <item name="android:editTextBackground"><strong i="5">@android</strong>:color/transparent</item> ohne Auswirkungen auf den RN-Paper TextInput sicher festlegen und haben den Absturz seitdem nicht mehr erlebt.

Sehen in der Produktion auf 0.59.9 .

Crashlytics:

Samsung Galaxy S7 Edge
Android 8.0

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
       at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures + 875(DrawableContainer.java:875)
       at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity + 1158(DrawableContainer.java:1158)
       at android.graphics.drawable.DrawableContainer.getOpacity + 433(DrawableContainer.java:433)
       at android.graphics.drawable.InsetDrawable.getOpacity + 258(InsetDrawable.java:258)
       at android.view.View.computeOpaqueFlags + 16809(View.java:16809)
       at android.view.View.setBackgroundDrawable + 21728(View.java:21728)
       at android.view.View.setBackground + 21621(View.java:21621)
       at android.view.View.<init> + 5553(View.java:5553)
       at android.widget.TextView.<init> + 1135(TextView.java:1135)
       at android.widget.EditText.<init> + 107(EditText.java:107)
       at android.widget.EditText.<init> + 103(EditText.java:103)
       at android.widget.EditText.<init> + 99(EditText.java:99)
       at android.widget.EditText.<init> + 95(EditText.java:95)
       at com.facebook.react.views.textinput.ReactTextInputShadowNode.setThemedContext + 76(ReactTextInputShadowNode.java:76)
       at com.facebook.react.uimanager.UIImplementation.createView + 294(UIImplementation.java:294)
       at com.facebook.react.uimanager.UIManagerModule.createView + 462(UIManagerModule.java:462)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.facebook.react.bridge.JavaMethodWrapper.invoke + 372(JavaMethodWrapper.java:372)
       at com.facebook.react.bridge.JavaModuleWrapper.invoke + 158(JavaModuleWrapper.java:158)
       at com.facebook.react.bridge.queue.NativeRunnable.run(NativeRunnable.java)
       at android.os.Handler.handleCallback + 789(Handler.java:789)
       at android.os.Handler.dispatchMessage + 98(Handler.java:98)
       at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage + 29(MessageQueueThreadHandler.java:29)
       at android.os.Looper.loop + 164(Looper.java:164)
       at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run + 232(MessageQueueThreadImpl.java:232)
       at java.lang.Thread.run + 764(Thread.java:764)

Ändern Sie dies:

state = {
  data: []
}

dazu:

constructor(props) {
  super(props);
  this.state = {
    data: []
  };
}

Das Problem wurde für mich behoben. Sie sind sich nicht sicher, warum, weil das Festlegen des Status als Klassenvariable in Ordnung sein sollte? Jemand?

@wbodron Nein, das hat nichts damit zu https://github.com/facebook/react-native/issues/17530#issuecomment -500865260

cc @cpojer @shergin @sahrens

Build-Ordner von Android löschen.
Your_Project> android> app> build

Führen Sie nach dem Löschen react-native run-android

sollte gut funktionieren.
Arbeitete für mich: D.

Ich habe dies bereits versucht und underlineColorAndroid entfernt, aber immer noch mit dem Problem. Jemand mit einer anderen Problemumgehung?

Dieses Problem hat dazu geführt, dass unsere App auch in der Produktion abstürzt. Es ist ein böser Fehler, weil es wirklich schwierig ist, ihn zu reproduzieren. Wir haben eine vielversprechende Lösung für unsere App gefunden und ich möchte unsere Ergebnisse hier teilen, um anderen hoffentlich Zeit und Frust zu ersparen.

Technische Daten und Versionen

Dieser Fehler hat dazu geführt, dass unsere App auf Samsung-, Google- und LG-Android-Geräten abstürzt. Wir haben Absturzberichte von folgenden Android-Versionen erhalten:

  • 8.0.0
  • 8.1.0
  • 7.1.1

Unsere App läuft:

  • react-native : 0.53.0
  • react : 16.2.0

Was verursacht den Absturz?

Wie andere in diesem Thread bemerkt haben, scheint das Problem durch das Rendern einer Kombination aus TextInput , FlatList und ScrollView Komponenten ausgelöst zu werden. In unserem Fall haben wir einen Bildschirm mit einem einzelnen TextInput der über einem FlatList gerendert wird. Wenn eines der Elemente in FlatList getippt wird, navigiert die App zu einem neuen Bildschirm mit einem Formular. Die Stammkomponente dieses Formulars ist eine ScrollView , die eine Reihe von TextInput -Komponenten enthält (zusammen mit einigen Schaltflächen und anderen benutzerdefinierten Komponenten). Unsere App stürzt ab, wenn der Benutzer auf eines dieser FlatList -Elemente tippt (beachten Sie, dass dies nicht jedes Mal passiert).
Es ist schwierig, dieses Problem zu reproduzieren. Tatsächlich konnten wir dies nicht tun. Wir wissen jedoch, dass der Absturz an diesem Punkt im Workflow auftritt, indem wir unsere Appsee-Sitzungsaufzeichnungen ansehen.
Da wir das Problem nicht reproduzieren können, mussten wir uns beim Debuggen auf die Absturzprotokolle von Appsee verlassen. Ich habe den Stack-Trace aus den folgenden Absturzberichten kopiert (und einige verrauschte Abschnitte weggelassen). Es ist mehr oder weniger identisch mit den Stapelspuren, die andere in diesem Thread gepostet haben:

0   java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
1   at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:875)
2   at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1158)
3   at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:433)
4   at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:258)
5   at android.view.View.computeOpaqueFlags(View.java:16900)
6   at android.view.View.setBackgroundDrawable(View.java:21824)
7   at android.view.View.setBackground(View.java:21717)
8   at android.view.View.<init>(View.java:5577)
9   at android.widget.TextView.<init>(TextView.java:1144)
...
13  at android.widget.EditText.<init>(EditText.java:96)
14  at com.facebook.react.views.textinput.ReactEditText.<init>(ReactEditText.java:91)
15  at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:91)
16  at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance(ReactTextInputManager.java:61)
...
35  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

Quelle des Problems

Nachdem ich diesen Thread gelesen und ein paar Stunden recherchiert hatte, fand ich den underlineColorAndroid Prop-Handler in der ReactTextInputManager.java -Datei:

@ReactProp(name = "underlineColorAndroid", customType = "Color")
public void setUnderlineColor(ReactEditText view, <strong i="44">@Nullable</strong> Integer underlineColor) {
  // Drawable.mutate() can sometimes crash due to an AOSP bug:
  // See https://code.google.com/p/android/issues/detail?id=191754 for more info
  Drawable background = view.getBackground();
  Drawable drawableToMutate = background.getConstantState() != null ?
    background.mutate() :
    background;

  if (underlineColor == null) {
    drawableToMutate.clearColorFilter();
  } else {
    drawableToMutate.setColorFilter(underlineColor, PorterDuff.Mode.SRC_IN);
  }
}

Der im Kommentar verlinkte Fehlerbericht enthält den folgenden Stack-Trace:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable()' on a null object reference
    at android.graphics.drawable.LayerDrawable$ChildDrawable.<init>(LayerDrawable.java:1723)
    at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:1792)
    at android.graphics.drawable.LayerDrawable.createConstantState(LayerDrawable.java:152)
    at android.graphics.drawable.LayerDrawable.mutate(LayerDrawable.java:1652)

Dies entspricht der Stapelverfolgung, auf die wir in unserer App stoßen. Ich gebe nicht vor, das zugrunde liegende Problem vollständig zu verstehen, aber es ist wahrscheinlich, dass die Ursache für den Absturz unserer App in der Produktion darin liegt, dass der Fehler Drawable.mutate() ausgelöst wird. Dies geschieht, wenn wir versuchen, die underlineColorAndroid -Stütze für unsere TextInput -Komponente festzulegen (und daher die ReactTextInputManager.setUnderlineColor -Methode aufzurufen).
Unsere App hat mit den folgenden Requisiten ein TextInput gerendert, von denen eines underlineColorAndroid="transparent" :

<TextInput
  ref={this.handleRef}
  value={this.props.value}
  autoCorrect={false}
  autoCapitalize="none"
  underlineColorAndroid="transparent"
  onSubmitEditing={this.handleSubmit}
  onChangeText={this.props.onChangeText}
  onFocus={this.handleFocused}
  onBlur={this.handleBlur}
  clearButtonMode="always"
/>

Wie wir es behoben haben

Wir mussten diese Requisite einstellen, um die Unterstreichung aus den TextInput -Komponenten in unserer App zu entfernen. Basierend auf unseren Erkenntnissen schien der Prop-Handler jedoch einen Android-Fehler auszulösen, der gelegentlich zum Absturz der App führte.
Glücklicherweise gibt es eine andere Möglichkeit, Unterstreichungen von TextInput -Komponenten unter Android zu entfernen. Sie können der Datei android/app/src/main/res/values/styles.xml eine Zeile hinzufügen:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowExitAnimation"><strong i="67">@android</strong>:anim/fade_out</item>
        <item name="android:windowBackground">@drawable/splash_screen</item>
+       <item name="android:editTextBackground"><strong i="68">@android</strong>:color/transparent</item>
    </style>
</resources>

Beachten Sie, dass ich auch die folgenden Vorschläge gesehen habe, aber dies hat die Unterstreichungen für uns nicht entfernt:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowExitAnimation"><strong i="73">@android</strong>:anim/fade_out</item>
        <item name="android:windowBackground">@drawable/splash_screen</item>
    </style>

+   <!-- This did *not* work for us... -->
+   <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
+     <item name="android:background"><strong i="74">@android</strong>:color/transparent</item>
+   </style>
</resources>

Damit wird das zugrunde liegende Problem nicht behoben. Es ist nur eine Problemumgehung, bei der die Verwendung der underlineColorAndroid -Stütze für TextInput -Komponenten vermieden wird.
Ich kann noch nicht mit Sicherheit sagen, dass dies tatsächlich funktioniert, da ich das Problem nicht lokal reproduzieren konnte. Wir werden diese Änderung in den kommenden Wochen in einem Update für unsere App bereitstellen. Danach müssen wir eine Weile warten, um zu sehen, ob es nicht mehr auftritt. Ich werde versuchen, mit unseren Ergebnissen zu berichten.
Viel Glück für alle, die mit diesem frustrierenden Thema ringen! Ich hoffe das hilft.

Ich weiß, wie ich diese Situation reproduzieren kann. Klicken Sie wie gesagt in das Formular zurück und dann auf Element in der Flatlist, um das Formular aufzurufen. Wiederholen Sie diesen Fehler ungefähr zehnmal und etwas schneller. Sie können den Fehler gemäß meinen Angaben reproduzieren.

Was kann ich tun? Ich stehe auch vor diesem Problem!

hier gilt das gleiche. Angesichts in der Produktion

@ jake41 Ich habe versucht, es neu zu starten und es hat funktioniert.

@agrass Ich werde deine Methode ausprobieren. Sieht vielversprechend aus.
Aber meine App stürzt aus diesem Grund sehr selten ab. Stürzt die App jedes Mal ab? oder manchmal?
Die DAU unserer App beträgt ca. 8.000, und dies geschieht ungefähr einmal am Tag. Es ist also vernachlässigbar, aber ich hoffe, den Absturz zu heilen.

Hat jemand eine richtige Lösung dafür gefunden? Es kommt sehr selten und nur in der Komponente vor, in der sich ein Textfeld befindet.

Das Problem besteht weiterhin mit React Native 0.60

Native reagieren: 0,59,8
Android: 8.1.0
Gerät: Redmi 5 Plus

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
       at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures + 875(DrawableContainer.java:875)
       at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity + 1158(DrawableContainer.java:1158)
       at android.graphics.drawable.DrawableContainer.getOpacity + 433(DrawableContainer.java:433)
       at android.graphics.drawable.InsetDrawable.getOpacity + 258(InsetDrawable.java:258)
       at android.view.View.computeOpaqueFlags + 15726(View.java:15726)
       at android.view.View.setBackgroundDrawable + 20536(View.java:20536)
       at android.view.View.setBackground + 20429(View.java:20429)
       at android.view.View.(View.java:5256)
       at android.widget.TextView.(TextView.java:826)
       at android.widget.EditText.(EditText.java:88)
       at android.widget.EditText.(EditText.java:84)
       at android.widget.EditText.(EditText.java:80)
       at android.widget.EditText.(EditText.java:76)
       at com.facebook.react.views.textinput.ReactEditText.(ReactEditText.java:89)
       at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance + 105(ReactTextInputManager.java:105)
       at com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance + 65(ReactTextInputManager.java:65)
       at com.facebook.react.uimanager.ViewManager.createView + 47(ViewManager.java:47)
       at com.facebook.react.uimanager.NativeViewHierarchyManager.createView + 256(NativeViewHierarchyManager.java:256)
       at com.facebook.react.uimanager.UIViewOperationQueue$CreateViewOperation.execute + 200(UIViewOperationQueue.java:200)
       at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.dispatchPendingNonBatchedOperations + 1109(UIViewOperationQueue.java:1109)
       at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.doFrameGuarded + 1080(UIViewOperationQueue.java:1080)
       at com.facebook.react.uimanager.GuardedFrameCallback.doFrame + 29(GuardedFrameCallback.java:29)
       at com.facebook.react.modules.core.ReactChoreographer$ReactChoreographerDispatcher.doFrame + 166(ReactChoreographer.java:166)
       at com.facebook.react.modules.core.ChoreographerCompat$FrameCallback$1.doFrame + 84(ChoreographerCompat.java:84)
       at android.view.Choreographer$CallbackRecord.run + 1027(Choreographer.java:1027)
       at android.view.Choreographer.doCallbacks + 841(Choreographer.java:841)
       at android.view.Choreographer.doFrame + 769(Choreographer.java:769)
       at android.view.Choreographer$FrameDisplayEventReceiver.run + 1015(Choreographer.java:1015)
       at android.os.Handler.handleCallback + 794(Handler.java:794)
       at android.os.Handler.dispatchMessage + 99(Handler.java:99)
       at android.os.Looper.loop + 176(Looper.java:176)
       at android.app.ActivityThread.main + 6651(ActivityThread.java:6651)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 547(RuntimeInit.java:547)
       at com.android.internal.os.ZygoteInit.main + 824(ZygoteInit.java:824)

Habe hier das gleiche Problem
RN: 0,59,9
Gerät: Pixel 2
Android: 9.0

Wenn es sich um einen Formularbildschirm handelt, warten Sie möglicherweise darauf, Werte in den Eingaben zu definieren. Dies hat bei mir funktioniert.

Ich habe eine Lösung gefunden. Ich bin mir nicht sicher, ob es langfristig ist, aber so können Sie arbeiten, bis eine dauerhafte Lösung gefunden ist.
Löschen Sie einfach Ihr Geld: npm start - --reset-cache
Und starten Sie das Projekt neu.
Es hat bei mir funktioniert.
Zu Ihrer Information, ich habe mein Projekt noch nicht ausgeworfen.
Meine Abhängigkeiten:

"devDependencies": {
"@ types / react": "^ 16.8.23",
"@ types / react-native": "^ 0.57.65",
"babel-preset-expo": "^ 6.0.0",
"Typoskript": "^ 3.4.5"
},

ExpoKit (SDK 34) Benutzer wiegt hier. Ich hatte dieses Problem bei allen Versionen von ExpoKit, einschließlich der neuesten. Ich habe versucht, diese Korrekturen mit einigen Änderungen anzuwenden, und bisher so gut.

Der Stilwechsel war etwas anders bei @Hopding - im Grunde hat das Gegenteil bei mir funktioniert. Ich habe den ExponentEditText -Stil in styles.xml als solchen geändert:

<style name="ExponentEditText" parent="<strong i="9">@android</strong>:style/Widget.EditText">
    <item name="android:padding">0dp</item>
    <item name="android:textColorHint">#c8c8c8</item>
    <item name="android:textColor">#000000</item>
    <item name="android:background"><strong i="10">@android</strong>:color/transparent</item>
  </style>

da die Änderung zu android:editTextBackground nicht funktioniert hat (vielleicht hat es etwas damit zu tun, dass dieser ExponentEditText -Stil bereits vorhanden ist). Interessanterweise musste ich die Standard-Requisite nicht entfernen, indem ich underlineColorAndroid auf transparent . Ich hatte das Problem mit der Polsterung. Ich hatte jedoch das Gefühl, dass es tatsächlich eine Verbesserung war, da ich mich nicht mehr mit dem eigentlichen Auffüllen des TextInput befassen musste, wenn dieser leer ist, und ich versuche, andere Komponenten in der Nähe zu positionieren.

Zuvor konnte ich den Fehler zuverlässig über eine Diagnoseschaltfläche auslösen, die ich unserer App hinzugefügt und 500 TextInputs zu einer SectionList hinzugefügt habe. Ich würde sagen, es löst nach meiner Erfahrung 60% der Zeit beim ersten Versuch aus, 90% beim zweiten und 100% beim dritten. Versuchte es mindestens 10 Mal ohne Fehler, nachdem ich die Änderung vorgenommen hatte.

Habe hier das gleiche Problem
RN: 0,55,4
Gerät: MI 8 Lite
Android: 8.1.0

java.lang.NullPointerException: Versuch, die virtuelle Methode 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawable (android.content.res.Resources)' für eine Nullobjektreferenz aufzurufen
at android.graphics.drawable.DrawableContainer $ DrawableContainerState.createAllFutures (DrawableContainer.java:875)
at android.graphics.drawable.DrawableContainer $ DrawableContainerState.getOpacity (DrawableContainer.java:1158)
at android.graphics.drawable.DrawableContainer.getOpacity (DrawableContainer.java:433)
at android.graphics.drawable.InsetDrawable.getOpacity (InsetDrawable.java:258)
at android.view.View.computeOpaqueFlags (View.java:15748)
bei android.view.View.setBackgroundDrawable (View.java:20558)
bei android.view.View.setBackground (View.java:20451)
bei android.view.View.(View.java:5255)
bei android.widget.TextView.(TextView.java:826)
bei android.widget.EditText.(EditText.java:88)
bei android.widget.EditText.(EditText.java:84)
bei android.widget.EditText.(EditText.java:80)
bei android.widget.EditText.(EditText.java:76)
at com.facebook.react.views.textinput.ReactTextInputShadowNode.setThemedContext (ReactTextInputShadowNode.java:80)
at com.facebook.react.uimanager.UIImplementation.createView (UIImplementation.java:282)
unter com.facebook.react.uimanager.UIManagerModule.createView (UIManagerModule.java:366)
bei java.lang.reflect.Method.invoke (Method.java)
unter com.facebook.react.bridge.JavaMethodWrapper.invoke (JavaMethodWrapper.java:372)
unter com.facebook.react.bridge.JavaModuleWrapper.invoke (JavaModuleWrapper.java:160)
at com.facebook.react.bridge.queue.NativeRunnable.run (NativeRunnable.java)
bei android.os.Handler.handleCallback (Handler.java:790)
bei android.os.Handler.dispatchMessage (Handler.java:99)
at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage (MessageQueueThreadHandler.java:29)
bei android.os.Looper.loop (Looper.java:164)
at com.facebook.react.bridge.queue.MessageQueueThreadImpl $ 3.run (MessageQueueThreadImpl.java:192)
bei java.lang.Thread.run (Thread.java:764)

Schwerwiegende Ausnahme: java.lang.NullPointerException
Versuchen Sie, die virtuelle Methode 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawable (android.content.res.Resources)' für eine Nullobjektreferenz aufzurufen

vivo 1804
Android-Version: 9

Passiert für mich. React Native Version 0.60.4 läuft auf Android 9. Sehr zeitweise und selten.

Passiert für mich. React Native Version 0.60.4 läuft auf Android 9. Sehr zeitweise und selten.

Das gleiche gilt auch für mich ...

Gleich hier, React Native 0.60.4 auf Android 9

Ich benutze React Native mit Expo und hatte heute Morgen dieses Problem.
Ich habe zuerst versucht, diese Zeile wie folgt in meine styles.xml AppTheme einzufügen

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
  <item name="android:editTextBackground"><strong i="9">@android</strong>:color/transparent</item>
</style>

Es hat nicht funktioniert, also habe ich nach einem anderen Ort gesucht und ihn schließlich dort abgelegt:

<style name="Theme.ReactNative.AppCompat.Light.NoActionBar.FullScreen"
       parent="@style/Theme.ReactNative.AppCompat.Light">
    <item name="android:windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
  <item name="android:editTextBackground"><strong i="16">@android</strong>:color/transparent</item>
</style>

Scheint jetzt perfekt zu funktionieren

Dieser Absturz ist so zufällig. Gleicher Stack-Trace, v0.60.4. Gleicher Fehler. Gibt es eine Lösung? Jemand hat vorgeschlagen, den Build-Ordner zu löschen, aber ich sehe nicht, was das mit einem Nullzeiger zu tun hat. Die Lösung scheint immer ein Wiederherstellen / erneutes Ausführen zu sein

@armagedan @jacobbeasley et al. Das Problem ist zeitweise, daher möchten Sie möglicherweise die in meinem obigen

@wxjer Ich versuche, App-Daten beim Einstellen zu löschen und es funktioniert! kannst du es versuchen

Gleich hier, React Native 0.60.4 auf Android 9 und Android 8

Irgendeine Lösung?

Falls jemand ein gutes Auge für das Debuggen von Android hat, ist hier unser Wachfehler, der gerade gemeldet wurde.

reaktionsnativ 0,60,4

https://sentry.io/share/issue/e0c581e2e99a4ca48199647b8bd3f497/

Gleich hier, React Native 0.60.5 auf Android 9

Hallo! Wir haben dieses Problem gelöst, indem wir die Eigenschaft underlineColorAndroid aus unserem TextInput entfernt und diese Zeile zu styles.xml hinzugefügt haben (android / src / main / res / values ​​/ styles.xml).

<item name="android:editTextBackground"><strong i="6">@android</strong>:color/transparent</item>

Ist das ein Fehlerbericht?

Ja

Haben Sie die Richtlinien für Beiträge gelesen?

Ja, es tut mir leid, dass ich außer dieser Stapelverfolgung keine weiteren Informationen zu dieser Ausnahme anbieten kann, da der Absturzbericht von Google Analytics erfasst wurde. Ich habe keine Ahnung, diese Ausnahme erneut anzuzeigen.

Umgebung

Umgebung:
Betriebssystem: macOS Sierra 10.12.6
Knoten: 8.4.0
Garn: 0,27,5
npm: 5.4.0
Android Studio: 3.0

Pakete: (gesucht => installiert)
reaktionsnativ: 0,51,0 => 0,51,0
reagieren: 16.0.0-alpha.12 => 16.0.0-alpha.12

Zielplattform: Android (7.1.1)
Handy: MIX 2
Android: 7.1.1
java.lang.NullPointerException:
Versuchung, die virtuelle Methode 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawable (android.content.res.Resources)' für eine Nullobjektreferenz unter aufzurufen
android.graphics.drawable.DrawableContainer $ DrawableContainerState.getChild (DrawableContainer.java:888) um
android.graphics.drawable.DrawableContainer.selectDrawable (DrawableContainer.java:466) um
android.graphics.drawable.StateListDrawable.onStateChange (StateListDrawable.java:104) um
android.graphics.drawable.Drawable.setState (Drawable.java:735) at
android.graphics.drawable.DrawableWrapper.onStateChange (DrawableWrapper.java:331) um
android.graphics.drawable.Drawable.setState (Drawable.java:735) at
android.graphics.drawable.LayerDrawable.onStateChange (LayerDrawable.java:1488) um
android.graphics.drawable.Drawable.setState (Drawable.java:735) at
android.view.View.drawableStateChanged (View.java:18002) bei
android.widget.TextView.drawableStateChanged (TextView.java:4097) bei
android.view.View.refreshDrawableState (View.java:18071) bei
android.view.View.setPressed (View.java:8543) bei
android.view.View.setPressed (View.java:8521) bei
android.view.View.onTouchEvent (View.java:11218) bei
android.widget.TextView.onTouchEvent (TextView.java:8467) bei
com.facebook.react.views.textinput.ReactEditText.onTouchEvent (ReactEditText.java:150)

React-Native 0,60,4 mich auch

RN 0.60.5 ist vor kurzem auf diesen Absturz gestoßen, hauptsächlich auf Android 8/9 (möglicherweise auch 10, haben das noch nicht ausführlich getestet).

https://github.com/facebook/react-native/issues/17530#issuecomment -504044357 scheint den Trick für mich zu tun. Normalerweise tritt der Absturz innerhalb der ersten ~ 5 Iterationen auf, die die Testkomponente durchläuft. Nachdem ich diese eine Zeile hinzugefügt hatte, lief sie ~ 200 Iterationen ohne Absturz, bevor ich sie stoppte.

Bearbeiten: Mit der Testkomponente kann ich dies auch auf Android 6 zuverlässig reproduzieren, obwohl das vorgeschlagene Update das Problem wieder zu lösen scheint.

Gleiches hier auf RN 0.61

Hallo Leute,

Dieses Problem besteht immer noch und es hat meine App kaputt gemacht - alles hat gut funktioniert, als ich einen Abruf hinzugefügt habe, und jetzt kann ich die App selbst dann nicht wieder zum Laufen bringen, wenn ich sie auskommentiere: weinen: Ich benutze übrigens Expo

BEARBEITEN: Ich habe mein Problem für die Expo behoben, indem ich die Expo-App auf meinem Gerät neu installiert habe

Auch dieser Fehler ist aufgetreten (RN: 0.61.1, Android 10 api 29). 'npm start --reset-cache' schien zu beheben.

@johnbowdenatfacet Möglicherweise möchten Sie die in meinem Kommentar oben angegebene Drop-In- Testkomponente ausprobieren, um die Korrektur zu bestätigen.

Gleicher Fehler.

React-Native 0.59.10
Android

java.lang.NullPointerException: Versuch, die virtuelle Methode 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawable (android.content.res.Resources)' für eine Nullobjektreferenz aufzurufen
at android.graphics.drawable.DrawableContainer $ DrawableContainerState.createAllFutures (DrawableContainer.java:875)
at android.graphics.drawable.DrawableContainer $ DrawableContainerState.getOpacity (DrawableContainer.java:1158)
at android.graphics.drawable.DrawableContainer.getOpacity (DrawableContainer.java:433)
at android.graphics.drawable.InsetDrawable.getOpacity (InsetDrawable.java:258)

Gleicher Fehler.

Hallo! Wir haben dieses Problem gelöst, indem wir die Eigenschaft underlineColorAndroid aus unserem TextInput entfernt und diese Zeile zu styles.xml hinzugefügt haben (android / src / main / res / values ​​/ styles.xml).

<item name="android:editTextBackground"><strong i="7">@android</strong>:color/transparent</item>

Ich habe mein Problem gelöst. Vielen Dank.

Ich bin gerade gelaufen (React-Native Run-Android), das hat das Problem mit mir gelöst

Gleiches Problem bei 0.61.3

Ich stehe immer noch vor dem Problem. Wir haben einige Benutzer, die Abstürze der Android-App melden, aber es passiert so zufällig, dass ich nicht reproduzieren kann.

+1, passierte auch für mich

@pedrosimao Vielleicht möchten Sie die in meinem obigen Testkomponente ausprobieren, um den Fehler zuverlässig zu reproduzieren. Dieser Kommentar weist auch auf eine Lösung für das Problem hin.

Ich habe das Problem eingegrenzt, das für mich eingegeben wird und aus der nativen Basis importiert wird.

Aktualisiert:
Ich habe meinen PC und mein Telefon neu gestartet und dann wieder ausgeführt. Es hat wie ein Zauber funktioniert :)

Ich hatte das auch. Ich habe das Problem gelöst, indem ich die Ausstellung über expo r -c erneut gestartet habe

Gleiches Problem für RN 0.59.10 melden

Ich fand manuelles Testen sehr erfolgreich und schrieb eine Komponente, um einige der oben beschriebenen Szenarien automatisch zu testen. Sie finden die Komponente unten. Sie müssen es nur irgendwo rendern, damit es seine Arbeit erledigt.

Dabei stellte ich fest, dass Sie dem AppTheme in styles.xml nur Folgendes hinzufügen müssen, wie von @Hopding vorgeschlagen
<item name="android:editTextBackground"><strong i="8">@android</strong>:color/transparent</item>

Es war nichts anderes erforderlich, und es gab keine Notwendigkeit, das Setzen von underlineColorAndroid zu vermeiden. Es war also egal, dass React Native es jetzt standardmäßig festlegt.

Der Hauptnachteil dieses Fixes besteht darin, dass Sie Ihre TextInputs neu formatieren müssen, um den daraus resultierenden Verlust an Polsterung zu berücksichtigen, und Sie verlieren auch das tatsächliche Unterstreichungsverhalten, was für uns von Vorteil war, da wir es immer als "transparent" festgelegt haben. mit iOS konsistent sein. Wenn Sie es brauchen, können Sie eine Wrapper-Komponente erstellen, die onFocus und onBlur und Ihre eigene Unterstreichung erstellt.

Meine Version von React Native ist 0.57.3

Hier sind einige andere Dinge, die ich mit meiner Testkomponente gefunden habe:

  1. Ich konnte den Absturz auf meinem Android-Tablet mit niedriger Spezifikation überhaupt nicht verursachen. Die Reproduktion war jedoch auf meinem Samsung S6 Edge-Telefon mit Android 7 recht einfach. Ich vermute, dass es eine Rennbedingung gibt, für die ein schnelleres Gerät erforderlich ist, um sie zu provozieren.
  2. Das Scrollen der Texteingaben machte keinen Unterschied, und ich konnte das Problem problemlos reproduzieren, ohne eine ScrollView zu verwenden.
  3. Die Eingabe von Text war nicht erforderlich. Das einfache Ändern des Fokus reichte aus, um den Absturz zu verursachen.
  4. Es machte keinen Unterschied, auf welche Farbe Sie die Unterstreichung setzen, selbst undefined verursachte den Absturz, aber Sie würden das vielleicht erwarten, da RN jetzt standardmäßig "transparent" ist.
  5. Die gleichzeitige Anzeige einer angemessenen Anzahl von TextInputs machte einen Unterschied, da der Absturz mit 100 schneller ablief als nur 10 auf dem Bildschirm.
  6. Ich konnte den Absturz nicht mit displayForMs: 0 reproduzieren, was darauf hindeutet, dass er nur auftritt, wenn die TextInputs erst kürzlich erstellt wurden.

Wenn Sie beim Testen nicht herumhängen möchten, können Sie die Ausgabe von adb logcat erfassen und nach den von der Komponente erzeugten Konsolenmeldungen und dem Absturzbericht suchen.

Hier ist meine Testkomponente, falls Sie sie verwenden möchten. Die Testparameter sind so eingestellt, dass sie in weniger als 30 Sekunden einen Absturz verursachen.

/**
 * A test component to reproduce the crash reported at
 * https://github.com/facebook/react-native/issues/17530
 */

import * as React from "react";
import { View, ScrollView, TextInput, Text, StyleSheet } from "react-native";

// These are the test parameters
const params = {
  underlineColors: ["red", undefined, "transparent", "rgba(0, 0, 0, 0)"],  // The colors to test
  numberOfInputs: 100, // How many TextInput to render at a time
  focusIntervalMs: 200, // How often to change focus between them
  displayForMs: 3000, // How long to display them (set to 0 for indefinite)
  delayDisplayForMs: 10, // How long to delay between displays
  withScrollView: false // Whether to use a ScrollView
};

const testText = index =>
  `Testing underlineColor = ${params.underlineColors[index] || "undefined"}`;

class AndroidTextInputTest extends React.Component{
  state = {
    underlineColorIndex: 0,
    showInputs: true,
    startKey: 0
  };
  mounted = false;
  focusInterval = undefined;
  textInputRefs = undefined;
  focussedInputIndex = 0;

  componentDidMount() {
    console.log(`Testing with params = `, JSON.stringify(params));
    this.mounted = true;
    setTimeout(this._showInputs, params.delayDisplayForMs);
    setInterval(this._focusAnInput, params.focusIntervalMs);
  }

  componentWillUnmount() {
    clearInterval(this.focusInterval);
    this.mounted = false;
  }

  _focusAnInput = () => {
    if (this.mounted && this.textInputRefs) {
      if (this.focussedInputIndex >= this.textInputRefs.length) {
        this.focussedInputIndex = 0;
      }
      const textInputRef = this.textInputRefs[this.focussedInputIndex];
      const textInput = this.refs[textInputRef];
      if (textInput) {
        this.focussedInputIndex++;
        this.refs[textInputRef].focus();
      }
    }
  };

  _showInputs = () => {
    if (this.mounted) {
      console.log(testText(this.state.underlineColorIndex));
      this.setState({ showInputs: true });
      if (params.displayForMs) {
        setTimeout(this._unshowInputs, params.displayForMs);
      }
    }
  };

  _unshowInputs = () => {
    this.focussedInputIndex = 0;
    this.textInputRefs = undefined;
    if (this.mounted) {
      let next = this.state.underlineColorIndex + 1;
      if (next === params.underlineColors.length) {
        next = 0;
      }
      this.setState({
        underlineColorIndex: next,
        showInputs: false,
        startKey: this.state.startKey + params.numberOfInputs
      });
      setTimeout(this._showInputs, params.delayDisplayForMs);
    }
  };

  render() {
    const textInputs = [];
    const { underlineColorIndex } = this.state;
    const underlineColor = params.underlineColors[underlineColorIndex];

    const refs = [];

    if (this.state.showInputs) {
      for (let i = 0; i < params.numberOfInputs; i++) {
        const key = this.state.startKey + i + "";
        refs.push(key);
        textInputs.push(
          <TextInput
            ref={key}
            key={key}
            placeholder={key}
            underlineColorAndroid={underlineColor}
            style={styles.textInput}
          />
        );
      }
      if (!this.textInputRefs) {
        this.textInputRefs = refs;
      }
    }

    return (
      <View style={styles.mainView}>
        <Text>{testText(underlineColorIndex)}</Text>
        {params.withScrollView ? (
          <React.Fragment>
            <Text>With ScrollView</Text>
            <ScrollView>{textInputs}</ScrollView>
          </React.Fragment>
        ) : (
          <React.Fragment>{textInputs}</React.Fragment>
        )}
      </View>
    );
  }
}

const styles = StyleSheet.create({
  mainView: {
    flex: 1,
    alignItems: "center"
  },
  textInput: {
    backgroundColor: "white",
    margin: 5,
    width: 300
  }
});

export default AndroidTextInputTest;

Versuchte dies, aber die Tastatur wurde in TextInputs nicht angezeigt. Irgendwelche Lösungen?

Vielen Dank, dass Sie meine Komponente @saketkumar ausprobiert haben.

Ich kann mich nicht erinnern, ob die Tastatur für diesen Test angezeigt werden muss, obwohl ich erwarten würde, dass sie angezeigt wird, wenn die Texteingabe fokussiert ist. Verwenden Sie ein tatsächliches Gerät oder einen Emulator?

Konnten Sie den Cursor in den Texteingaben sehen, als sie fokussiert waren, und konnte die Komponente den Absturz für Sie reproduzieren?

Das Gleiche

Passiert in reagieren 0,59 auf verschiedenen Android-Handys.

Tritt zufällig in Komponenten auf, bei denen TextInput innerhalb von Flatlist verschachtelt ist

Es wurde versucht, underlineColorAndroid={null} atrribute auf TextInput wie in diesem Thread beschrieben, aber der Fehler bleibt bestehen

Ich musste mein Telefon neu starten und EXPO neu installieren, damit es repariert wurde. Wenn das bei Ihnen nicht funktioniert, würde ich versuchen, Ihren Cache und den Cache der EXPO-APP selbst zu löschen.

Ich habe keine Ahnung, wie dieser FEHLER überhaupt aufgetreten ist. Ich konnte es weder neu erstellen noch herausfinden, wie ich verhindern konnte, dass es erneut passiert.
Es hat gerade erst angefangen und egal was ich in meinem Code geändert habe, es hat es nicht behoben. Es ist mit Sicherheit das Problem mit der EXPO-APP, da ich den FEHLER in der APP sehe, aber nicht in meiner Konsole oder irgendwo anders.

+1 Fehler in RN 0.59.9 noch vorhanden. berichtet von Firebase Crashlytics

erster, der diesen Fehler auf RN 0.61 bekommt?

Mit dem gleichen Fehler in RN 0.61 wurde die Lösung von @diegotsi behoben.
Dies ist ein ernstes Problem, da es mir zum ersten Mal in der Vorproduktionsumgebung passiert ist und ich es ohne Crashlytics niemals hätte verfolgen können, da unberechenbares Verhalten die Reproduktion erschwert.

Ist das ein Fehlerbericht?

Ja

Haben Sie die Richtlinien für Beiträge gelesen?

Ja, es tut mir leid, dass ich außer dieser Stapelverfolgung keine weiteren Informationen zu dieser Ausnahme anbieten kann, da der Absturzbericht von Google Analytics erfasst wurde. Ich habe keine Ahnung, diese Ausnahme erneut anzuzeigen.

Umgebung

Umgebung:
Betriebssystem: macOS Sierra 10.12.6
Knoten: 8.4.0
Garn: 0,27,5
npm: 5.4.0
Android Studio: 3.0

Pakete: (gesucht => installiert)
reaktionsnativ: 0,51,0 => 0,51,0
reagieren: 16.0.0-alpha.12 => 16.0.0-alpha.12

Zielplattform: Android (7.1.1)
Handy: MIX 2
Android: 7.1.1
java.lang.NullPointerException:
Versuchung, die virtuelle Methode 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawable (android.content.res.Resources)' für eine Nullobjektreferenz unter aufzurufen
android.graphics.drawable.DrawableContainer $ DrawableContainerState.getChild (DrawableContainer.java:888) um
android.graphics.drawable.DrawableContainer.selectDrawable (DrawableContainer.java:466) um
android.graphics.drawable.StateListDrawable.onStateChange (StateListDrawable.java:104) um
android.graphics.drawable.Drawable.setState (Drawable.java:735) at
android.graphics.drawable.DrawableWrapper.onStateChange (DrawableWrapper.java:331) um
android.graphics.drawable.Drawable.setState (Drawable.java:735) at
android.graphics.drawable.LayerDrawable.onStateChange (LayerDrawable.java:1488) um
android.graphics.drawable.Drawable.setState (Drawable.java:735) at
android.view.View.drawableStateChanged (View.java:18002) bei
android.widget.TextView.drawableStateChanged (TextView.java:4097) bei
android.view.View.refreshDrawableState (View.java:18071) bei
android.view.View.setPressed (View.java:8543) bei
android.view.View.setPressed (View.java:8521) bei
android.view.View.onTouchEvent (View.java:11218) bei
android.widget.TextView.onTouchEvent (TextView.java:8467) bei
com.facebook.react.views.textinput.ReactEditText.onTouchEvent (ReactEditText.java:150)

Ist das ein Fehlerbericht?

Ja

Haben Sie die Richtlinien für Beiträge gelesen?

Ja, es tut mir leid, dass ich außer dieser Stapelverfolgung keine weiteren Informationen zu dieser Ausnahme anbieten kann, da der Absturzbericht von Google Analytics erfasst wurde. Ich habe keine Ahnung, diese Ausnahme erneut anzuzeigen.

Umgebung

Umgebung:
Betriebssystem: macOS Sierra 10.12.6
Knoten: 8.4.0
Garn: 0,27,5
npm: 5.4.0
Android Studio: 3.0

Pakete: (gesucht => installiert)
reaktionsnativ: 0,51,0 => 0,51,0
reagieren: 16.0.0-alpha.12 => 16.0.0-alpha.12

Zielplattform: Android (7.1.1)
Handy: MIX 2
Android: 7.1.1
java.lang.NullPointerException:
Versuchung, die virtuelle Methode 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawable (android.content.res.Resources)' für eine Nullobjektreferenz unter aufzurufen
android.graphics.drawable.DrawableContainer $ DrawableContainerState.getChild (DrawableContainer.java:888) um
android.graphics.drawable.DrawableContainer.selectDrawable (DrawableContainer.java:466) um
android.graphics.drawable.StateListDrawable.onStateChange (StateListDrawable.java:104) um
android.graphics.drawable.Drawable.setState (Drawable.java:735) at
android.graphics.drawable.DrawableWrapper.onStateChange (DrawableWrapper.java:331) um
android.graphics.drawable.Drawable.setState (Drawable.java:735) at
android.graphics.drawable.LayerDrawable.onStateChange (LayerDrawable.java:1488) um
android.graphics.drawable.Drawable.setState (Drawable.java:735) at
android.view.View.drawableStateChanged (View.java:18002) bei
android.widget.TextView.drawableStateChanged (TextView.java:4097) bei
android.view.View.refreshDrawableState (View.java:18071) bei
android.view.View.setPressed (View.java:8543) bei
android.view.View.setPressed (View.java:8521) bei
android.view.View.onTouchEvent (View.java:11218) bei
android.widget.TextView.onTouchEvent (TextView.java:8467) bei
com.facebook.react.views.textinput.ReactEditText.onTouchEvent (ReactEditText.java:150)

Dies passiert, wenn ich etwas in meinem Stil ändere, wie zum Beispiel das Löschen von defineContent oder so etwas, und das Neustarten der App vorübergehend funktioniert.

@cinocai , @Sargnec et al., dieser Kommentarthread wird so lang, dass ich denke, dass den Leuten die oben gepostet habe

Mehrere oben genannte Personen haben es verwendet, um dieses Problem erfolgreich zu reproduzieren und die Lösung zu überprüfen, die auch in diesem Kommentar erwähnt wird.

@ glenn-axsy: Tolle Arbeit mit Testkomponenten, war sehr hilfreich, um das Problem besser zu verstehen.
Aber ich kämpfe darum, eine Lösung zu finden.

Wie Sie beim Setzen von displayForMs: 0 vorgeschlagen haben, stürzt es nicht ab. Wenn ich mich nicht irre, werden die 100 TextInputs niemals aufgehoben (nur Updates), auch keine neuen.

Ich habe versucht, displayForMs: 3000 selbst festzulegen, und zwei weitere Änderungen vorgenommen, bei denen alle 100 für jeden festgelegten Status bereitgestellt (nur aktualisiert) wurden.

Änderungen

  • const key = this.state.startKey + i + ""; ---> const key = ${i} ;
  • Deaktiviert check if (this.state.showInputs) { innerhalb des Renderings.

Code

/**
 * A test component to reproduce the crash reported at
 * https://github.com/facebook/react-native/issues/17530
 */

import * as React from 'react';
import { View, ScrollView, TextInput, Text, StyleSheet } from 'react-native';

// These are the test parameters
const params = {
    underlineColors: ['red', undefined, 'transparent', 'rgba(0, 0, 0, 0)'], // The colors to test
    numberOfInputs: 100, // How many TextInput to render at a time
    focusIntervalMs: 200, // How often to change focus between them
    displayForMs: 3000, // How long to display them (set to 0 for indefinite)
    delayDisplayForMs: 10, // How long to delay between displays
    withScrollView: false, // Whether to use a ScrollView
};

const testText = index =>
    `Testing underlineColor = ${params.underlineColors[index] || 'undefined'}`;

class AndroidTextInputTest extends React.Component {
  state = {
    underlineColorIndex: 0,
    showInputs: true,
    startKey: 0,
  };
  mounted = false;
  focusInterval = undefined;
  textInputRefs = undefined;
  focussedInputIndex = 0;

  componentDidMount() {
    console.log('Testing with params = ', JSON.stringify(params));
    this.mounted = true;
    setTimeout(this._showInputs, params.delayDisplayForMs);
    setInterval(this._focusAnInput, params.focusIntervalMs);
  }

  componentWillUnmount() {
    clearInterval(this.focusInterval);
    this.mounted = false;
  }

  _focusAnInput = () => {
    if (this.mounted && this.textInputRefs) {
        if (this.focussedInputIndex >= this.textInputRefs.length) {
            this.focussedInputIndex = 0;
        }
        const textInputRef = this.textInputRefs[this.focussedInputIndex];
        const textInput = this.refs[textInputRef];
        if (textInput) {
            this.focussedInputIndex++;
            this.refs[textInputRef].focus();
        }
    }
  };

  _showInputs = () => {
    if (this.mounted) {
        console.log(testText(this.state.underlineColorIndex));
        this.setState({ showInputs: true });
        if (params.displayForMs) {
            setTimeout(this._unshowInputs, params.displayForMs);
        }
    }
  };

  _unshowInputs = () => {
    this.focussedInputIndex = 0;
    this.textInputRefs = undefined;
    if (this.mounted) {
        let next = this.state.underlineColorIndex + 1;
        if (next === params.underlineColors.length) {
            next = 0;
        }
        this.setState({
            underlineColorIndex: next,
            showInputs: false,
            startKey: this.state.startKey + params.numberOfInputs,
        });
        setTimeout(this._showInputs, params.delayDisplayForMs);
    }
  };

  render() {
    const textInputs = [];
    const { underlineColorIndex } = this.state;
    const underlineColor = params.underlineColors[underlineColorIndex];

    const refs = [];

// CHANGE 2
    // if (this.state.showInputs) {
    for (let i = 0; i < params.numberOfInputs; i++) {
        const key = `${i}`; // CHANGE 1
        refs.push(key);
        textInputs.push(
            <textinput i="23"/>
        );
    }
    if (!this.textInputRefs) {
        this.textInputRefs = refs;
    }
    // }

    return (
        <view i="24">
            <text i="25">{testText(underlineColorIndex)}</text>
            {params.withScrollView ? (
                <react.fragment i="26">
                    <text i="27">With ScrollView</text>
                    <scrollview i="28">{textInputs}</scrollview>
                </react.fragment>
            ) : (
                <react.fragment i="29">{textInputs}</react.fragment>
            )}
        </view>
    );
  }
}

const styles = StyleSheet.create({
    mainView: {
        flex: 1,
        alignItems: 'center',
    },
    textInput: {
        backgroundColor: 'white',
        margin: 5,
        width: 300,
    },
});

export default AndroidTextInputTest;

Durch beide Änderungen wurde sichergestellt, dass durch das Aufrufen von _showInputs und _unshowInputs weder die TextInputs erneut bereitgestellt noch neue (max. 100) bereitgestellt werden.
Und es stürzt nicht wie erwartet ab.

Stellen Sie schließlich sicher, dass das Problem tatsächlich erneut bereitgestellt wird (eine große Anzahl von TextInputs). Ich habe versucht, es in der App zu reproduzieren, an der ich arbeite, in der der Absturz gemeldet wurde.

In der App gibt es 2 Bildschirme, einer mit 2 TextInputs und der andere mit 4, ich habe weiter auf den Bildschirmen hin und her navigiert, was natürlich den gesamten Bildschirminhalt wieder einfügt, und nach einer Weile konnte ich den Absturz bekommen.

Daraus könnte ich schließen, dass es keine praktikable Lösung ist, TextInput nicht aushängen zu lassen. Aber immer noch keine Ahnung, was genau das verursacht!

HINWEIS

  • Ich glaube nicht, dass es mit underlineColorAndroid Eigentum zusammenhängt, weil ich versucht habe, es mit <item name="android:editTextBackground"><strong i="18">@android</strong>:color/transparent</item> überschreiben, und keinen Unterschied. [Bearbeitet: Es behebt das Problem vorerst]
  • Außerdem konnte ich abstürzen, ohne ein ScrollView .
  • Und das Fokussieren der TextInput war auch nicht erforderlich, um einen Absturz zu erzielen. Das einfache erneute Mounten dieser 100 TextInputs führte zum Absturz.

Vielen Dank!

@rimzici Ja das stimmt. Der Absturz hängt mit dem erneuten Bereitstellen / Instanziieren eines Edittextes zusammen. Manchmal sind die Hintergrund-Drawables null. Aber seltsamerweise passiert das nicht, wenn Sie <item name="android:editTextBackground"><strong i="6">@android</strong>:color/transparent</item> setzen. Es scheint, dass die Drawables nach dem Klonen irgendwie recycelt wurden und wenn ein Hintergrund festgelegt wird, kann er einen Standardwert haben?

Danke @rimzici.

Es ist enttäuschend zu hören, dass das einfache Setzen von <item name="android:editTextBackground"><strong i="6">@android</strong>:color/transparent</item> Problem nicht für Sie behoben hat. Zumindest haben Sie jetzt eine Möglichkeit, den Fehler einfach zu reproduzieren, und können einige andere Dinge ausprobieren.

Bitte posten Sie weitere Beobachtungen, die Sie möglicherweise haben.

Danke @sunnylqm und @ glenn-axsy! Sie haben Recht, das Setzen von <item name="android:editTextBackground"><strong i="6">@android</strong>:color/transparent</item> behebt tatsächlich.

Ich habe vergessen, dass für meine Hauptaktivität ein Begrüßungsthema festgelegt wurde, um den weißen Bildschirm beim Laden von JS abzudecken.

Jetzt kann ich bestätigen, dass die Umgehung einen Absturz wirksam verhindert.

Wird mit weiteren Informationen aktualisiert.

React-Native 0.61.5 <- ist auch hier!

React-Native 0.62.0.rc-1 <- ist auch hier!

Gleicher Fehler bei [email protected]

Viele Vorkommen desselben Fehlers treffen, der von Sentry abgefangen wurde: https://sentry.io/share/issue/ac1e7c55f1594b118f0faaf8d11de5c4/

Auf RN 0,59,9

Gleicher Fehler bei RN 0.55.4

Gleiches Problem bei RN 2.0.1

Setzen Sie die Requisiten von 'underlineColorAndroid' nicht auf TextInput und entfernen Sie den gesamten Texteingabehintergrund nach nativen Stilen.

gehe zu android \ app \ src \ main \ res \ values ​​\ styles.xml

Ändern Sie das wie folgt:

Gleiches gilt für RN 0.61.5

Ich fand manuelles Testen sehr erfolgreich und schrieb eine Komponente, um einige der oben beschriebenen Szenarien automatisch zu testen. Sie finden die Komponente unten. Sie müssen es nur irgendwo rendern, damit es seine Arbeit erledigt.

Dabei stellte ich fest, dass Sie dem AppTheme in styles.xml nur Folgendes hinzufügen müssen, wie von @Hopding vorgeschlagen
<item name="android:editTextBackground"><strong i="8">@android</strong>:color/transparent</item>

Es war nichts anderes erforderlich, und es gab keine Notwendigkeit, das Setzen von underlineColorAndroid zu vermeiden. Es war also egal, dass React Native es jetzt standardmäßig festlegt.

Der Hauptnachteil dieses Fixes besteht darin, dass Sie Ihre TextInputs neu formatieren müssen, um den daraus resultierenden Verlust an Polsterung zu berücksichtigen, und Sie verlieren auch das tatsächliche Unterstreichungsverhalten, was für uns von Vorteil war, da wir es immer als "transparent" festgelegt haben. mit iOS konsistent sein. Wenn Sie es brauchen, können Sie eine Wrapper-Komponente erstellen, die onFocus und onBlur und Ihre eigene Unterstreichung erstellt.

Meine Version von React Native ist 0.57.3

Hier sind einige andere Dinge, die ich mit meiner Testkomponente gefunden habe:

  1. Ich konnte den Absturz auf meinem Android-Tablet mit niedriger Spezifikation überhaupt nicht verursachen. Die Reproduktion war jedoch auf meinem Samsung S6 Edge-Telefon mit Android 7 recht einfach. Ich vermute, dass es eine Rennbedingung gibt, für die ein schnelleres Gerät erforderlich ist, um sie zu provozieren.
  2. Das Scrollen der Texteingaben machte keinen Unterschied, und ich konnte das Problem problemlos reproduzieren, ohne eine ScrollView zu verwenden.
  3. Die Eingabe von Text war nicht erforderlich. Das einfache Ändern des Fokus reichte aus, um den Absturz zu verursachen.
  4. Es machte keinen Unterschied, auf welche Farbe Sie die Unterstreichung setzen, selbst undefined verursachte den Absturz, aber Sie würden das vielleicht erwarten, da RN jetzt standardmäßig "transparent" ist.
  5. Die gleichzeitige Anzeige einer angemessenen Anzahl von TextInputs machte einen Unterschied, da der Absturz mit 100 schneller ablief als nur 10 auf dem Bildschirm.
  6. Ich konnte den Absturz nicht mit displayForMs: 0 reproduzieren, was darauf hindeutet, dass er nur auftritt, wenn die TextInputs erst kürzlich erstellt wurden.

Wenn Sie beim Testen nicht herumhängen möchten, können Sie die Ausgabe von adb logcat erfassen und nach den von der Komponente erzeugten Konsolenmeldungen und dem Absturzbericht suchen.

Hier ist meine Testkomponente, falls Sie sie verwenden möchten. Die Testparameter sind so eingestellt, dass sie in weniger als 30 Sekunden einen Absturz verursachen.

/**
 * A test component to reproduce the crash reported at
 * https://github.com/facebook/react-native/issues/17530
 */

import * as React from "react";
import { View, ScrollView, TextInput, Text, StyleSheet } from "react-native";

// These are the test parameters
const params = {
  underlineColors: ["red", undefined, "transparent", "rgba(0, 0, 0, 0)"],  // The colors to test
  numberOfInputs: 100, // How many TextInput to render at a time
  focusIntervalMs: 200, // How often to change focus between them
  displayForMs: 3000, // How long to display them (set to 0 for indefinite)
  delayDisplayForMs: 10, // How long to delay between displays
  withScrollView: false // Whether to use a ScrollView
};

const testText = index =>
  `Testing underlineColor = ${params.underlineColors[index] || "undefined"}`;

class AndroidTextInputTest extends React.Component{
  state = {
    underlineColorIndex: 0,
    showInputs: true,
    startKey: 0
  };
  mounted = false;
  focusInterval = undefined;
  textInputRefs = undefined;
  focussedInputIndex = 0;

  componentDidMount() {
    console.log(`Testing with params = `, JSON.stringify(params));
    this.mounted = true;
    setTimeout(this._showInputs, params.delayDisplayForMs);
    setInterval(this._focusAnInput, params.focusIntervalMs);
  }

  componentWillUnmount() {
    clearInterval(this.focusInterval);
    this.mounted = false;
  }

  _focusAnInput = () => {
    if (this.mounted && this.textInputRefs) {
      if (this.focussedInputIndex >= this.textInputRefs.length) {
        this.focussedInputIndex = 0;
      }
      const textInputRef = this.textInputRefs[this.focussedInputIndex];
      const textInput = this.refs[textInputRef];
      if (textInput) {
        this.focussedInputIndex++;
        this.refs[textInputRef].focus();
      }
    }
  };

  _showInputs = () => {
    if (this.mounted) {
      console.log(testText(this.state.underlineColorIndex));
      this.setState({ showInputs: true });
      if (params.displayForMs) {
        setTimeout(this._unshowInputs, params.displayForMs);
      }
    }
  };

  _unshowInputs = () => {
    this.focussedInputIndex = 0;
    this.textInputRefs = undefined;
    if (this.mounted) {
      let next = this.state.underlineColorIndex + 1;
      if (next === params.underlineColors.length) {
        next = 0;
      }
      this.setState({
        underlineColorIndex: next,
        showInputs: false,
        startKey: this.state.startKey + params.numberOfInputs
      });
      setTimeout(this._showInputs, params.delayDisplayForMs);
    }
  };

  render() {
    const textInputs = [];
    const { underlineColorIndex } = this.state;
    const underlineColor = params.underlineColors[underlineColorIndex];

    const refs = [];

    if (this.state.showInputs) {
      for (let i = 0; i < params.numberOfInputs; i++) {
        const key = this.state.startKey + i + "";
        refs.push(key);
        textInputs.push(
          <TextInput
            ref={key}
            key={key}
            placeholder={key}
            underlineColorAndroid={underlineColor}
            style={styles.textInput}
          />
        );
      }
      if (!this.textInputRefs) {
        this.textInputRefs = refs;
      }
    }

    return (
      <View style={styles.mainView}>
        <Text>{testText(underlineColorIndex)}</Text>
        {params.withScrollView ? (
          <React.Fragment>
            <Text>With ScrollView</Text>
            <ScrollView>{textInputs}</ScrollView>
          </React.Fragment>
        ) : (
          <React.Fragment>{textInputs}</React.Fragment>
        )}
      </View>
    );
  }
}

const styles = StyleSheet.create({
  mainView: {
    flex: 1,
    alignItems: "center"
  },
  textInput: {
    backgroundColor: "white",
    margin: 5,
    width: 300
  }
});

export default AndroidTextInputTest;

Kann bestätigen, dass dies für mich behoben wurde!

Ich bin froh, dass meine Testkomponente und die vorgeschlagene Lösung für Sie @gagangoku funktioniert haben

Für diejenigen, die es im Kontext sehen wollen, ist der Link hier

Vielleicht wären Sie so freundlich, diesen Link zu Ihrem Kommentar hinzuzufügen.

Das Update von @ glenn-axsy für mich gearbeitet (wie das tat Testkomponente 👏👏👏), aber ich lief in einige Schwierigkeiten auf dem Weg , die eine weitere verlorene Seele helfen können:

Mein AppTheme wurde in der Datei AndroidManifest.xml aufgrund eines Fehlers, den ein Entwickler beim Hinzufügen einer Begrüßungsbildschirmaktivität gemacht hatte, nicht ordnungsgemäß überschrieben. Sobald ich das Problem behoben und bestätigt habe, dass das AppTheme tatsächlich verwendet wird (z. B. indem die Standardtextfarbe geändert und in der App angezeigt wird), hat das Problem tatsächlich funktioniert.

Vielen Dank und viel Glück da draußen!

Es passiert mir mit expo. Ich führe diesen Befehl aus.
sudo expo start -c und das Problem ist weg.

@HakimAsa Ich schlage vor , die mit Testen Komponente sicherzustellen, dass es wirklich gegangen ist.

Ihre seltsame Sache ist, dass der Code seit einem Monat ohne dieses Problem funktioniert. Aber nach einigem wiederholten Nachladen von Änderungen bin ich gestern auf ein Problem gestoßen ... Wie auch immer, ich werde Ihren Vorschlag @ glenn-axsy versuchen

In meinem Fall war es in einer FlatList so, dass renderItem <TextInput /> zurückgibt. Also habe ich dieses Problem gelöst, indem ich <><TextInput /></>

@MahmoudHemaid das Problem ist so schwer zu reproduzieren, dass Sie es möglicherweise nicht wirklich gelöst haben. Weitere Informationen hier .

android.graphics.drawable.Drawable $ constantstate, newdrawable bei einem Null-Referenzfehler, der beim Klicken auf ein Bild in der rechten Ecke angezeigt wird. Und dieses Bild wirkte wie ein Umschaltknopf. Ich benutze RN 0.61.2. Bitte helfen Sie mir, das Problem zu lösen. es passiert nur in eigenständiger apk

@ glenn-axsy https://github.com/facebook/react-native/issues/17530#issuecomment -504044357

Dabei stellte ich fest, dass Sie dem AppTheme in styles.xml nur Folgendes hinzufügen müssen, wie von @Hopding vorgeschlagen

<item name="android:editTextBackground"><strong i="9">@android</strong>:color/transparent</item>

https://github.com/facebook/react-native/pull/27782#issuecomment -575753501

Das einfachste Beispiel wäre, einfach ein EditText mit einem Null AttributeSet und keinen (0) Standardstilattributen zu erstellen:

<strong i="18">@Override</strong>
 protected EditText createDummyEditText() {
   return new EditText(getThemedContext(), null, 0);
 }

ReactTextInput kann durch Unterklassen überschrieben werden, die eine eigene Instanz von EditText bereitstellen möchten.

Der Android-Konstruktor EditText :

public class EditText extends TextView {
     public EditText(Context context, AttributeSet attrs, int defStyleAttr) {
           this(context, attrs, defStyleAttr, 0);
     }
}

welches den View Konstruktor ( docs ) aufruft

image

Ich werde weiter nachforschen. Vielen Dank

Hey @ glenn-axsy, ich habe stundenlang damit zu kämpfen, also hoffe ich wirklich, dass du mir helfen kannst. Ich verwende Ihren AndroidTextInputTest auf meinem Android-Handy. Ich führe React Native mit Typescript aus, wenn dies wichtig ist, und zwar über Expo. Dies bedeutet, dass ich keine EditText-Inhalte habe.
React native in package.json = "react-native": "^ 0.61.4"

Ich habe die Parameter verwendet:

const params = {
underlineColors: ["rot", undefiniert, "transparent", "rgba (0, 0, 0, 0)"], // Die zu testenden Farben
numberOfInputs: 100, // Wie viele TextInputs gleichzeitig gerendert werden sollen
focusIntervalMs: 200, // Wie oft muss der Fokus zwischen ihnen gewechselt werden?
displayForMs: 3000, // Wie lange sollen sie angezeigt werden (auf unbestimmte Zeit auf 0 gesetzt)
delayDisplayForMs: 10, // Wie lange zwischen den Anzeigen verzögert werden soll
withScrollView: false, // Gibt an, ob eine ScrollView verwendet werden soll
};

Und meine Ausgabe vor dem "Versuch, eine virtuelle Methode aufzurufen" war:

Testen mit params = {"underlineColors": ["rot", null, "transparent", "rgba (0, 0, 0, 0)"], "numberOfInputs": 100, "focusIntervalMs": 200, "displayForMs": 3000, "delayDisplayForMs": 10, "withScrollView": false}
Die Parameter von calendarVisible sind wahr und der Status ist wahr
Testen von underlineColor = red
Testen von underlineColor = undefined
Testen von underlineColor = transparent
Testen von underlineColor = rgba (0, 0, 0, 0)
Testen von underlineColor = red
Testen von underlineColor = undefined
Testen von underlineColor = transparent

Meine Frage von hier ist also, wie ich diese Parameter und die Ausgabe, die ich vor dem Absturz gesehen habe, verwenden kann, um zu diagnostizieren, was in meiner App falsch läuft.

Vielen Dank für jede Hilfe.

@ucheNkadiCode Es ist ein Test, um das Problem schnell zu reproduzieren, keine Lösung. Die Lösung ist

<item name="android:editTextBackground"><strong i="7">@android</strong>:color/transparent</item>

@ucheNkadiCode Es ist ein Test, um das Problem schnell zu reproduzieren, keine Lösung. Die Lösung ist

<item name="android:editTextBackground"><strong i="8">@android</strong>:color/transparent</item>

@sunnylqm Ich bin etwas verwirrt, weil ich

Ich verwende einen TextInput, der so aussieht:

Text Eingabe
ref = {key}
key = {key}
Platzhalter = {Schlüssel}
underlineColorAndroid = {underlineColor}
style = {styles.textInput}

Vielen Dank

@ucheNkadiCode
image
Aber für die Ausstellung müssen Sie möglicherweise zuerst auswerfen, um Einstellungen wie diese zu ändern

@ucheNkadiCode
image
Aber für die Ausstellung müssen Sie möglicherweise zuerst auswerfen, um Einstellungen wie diese zu ändern

Ja, das wäre zu Recht das Problem. Ich möchte nicht den Preis dafür zahlen, dass ich meine native Native-App so früh in ihrer Entwicklung auswerfe. Ich hoffe, eine Lösung zu finden, die mich in React Native hält.

Danke für Ihre Hilfe

@ axsy-dev @ucheNkadiCode

Mein Kommentar arbeitete in diese Richtung, um dies in einer Pull-Anfrage zu beheben und die Probleme zu vermeiden, die mit TextInput prop underlineColorAndroid . ReactNative legt das Thema programmatisch fest ... Bitte überprüfen Sie meinen Kommentar und melden Sie sich mit einigen Rückmeldungen bei mir, da ich dieses Problem nicht lösen konnte und gerade an einer anderen Pull-Anfrage arbeite. Vielen Dank

Ich konnte dieses Problem tatsächlich lösen, indem ich die native ReactTextInput -Methode umschrieb

<strong i="12">@Override</strong>
 protected EditText createDummyEditText() {
   return new EditText(getThemedContext(), null, 0);
 }

Dies deaktiviert jedoch nur den an die EditText-Komponente übergebenen Stil mit getThemedContext()

Zusätzlich teilt uns der Stapel mit, dass dieser Fehler durch ReactEditText.onTouchEvent ausgelöst wird. Wenn der Benutzer also die Komponente TextInput berührt.

Mein Kommentar arbeitete in diese Richtung, um dies in einer Pull-Anfrage zu beheben und die Probleme zu vermeiden, die mit TextInput prop underlineColorAndroid . ReactNative legt das Thema programmatisch fest ... Bitte überprüfen Sie meinen Kommentar und melden Sie sich mit einigen Rückmeldungen bei mir, da ich dieses Problem nicht lösen konnte und derzeit an anderen Pull-Anforderungen arbeite.

Ich konnte dieses Problem tatsächlich lösen, indem ich die native ReactTextInput -Methode umschrieb

<strong i="12">@Override</strong>
 protected EditText createDummyEditText() {
   return new EditText(getThemedContext(), null, 0);
 }

Dies deaktiviert jedoch nur den an die EditText-Komponente übergebenen Stil mit getThemedContext()

Zusätzlich teilt uns der Stapel mit, dass dieser Fehler durch ReactEditText.onTouchEvent ausgelöst wird. Wenn der Benutzer also die Komponente TextInput berührt.

@ axsy-dev @ fabriziobertoglio1987. Ich habe also keine Elemente, die ich mit ReactEditText in meinem Projektverzeichnis finden kann, und ich habe auch keine .java-Dateien in meinem Verzeichnis. Ich verwende TypeScript mit React native, daher sind die meisten meiner Dateien .tsx oder .ts mit Ausnahme vieler node_modules.

Ich benutze Native Android leider nicht.

@ucheNkadiCode , um dies zu lösen, müssen Sie jetzt auswerfen, andernfalls erstellen Sie dieses Szenario reaktionsschnell neu, schreiben eine Pull-Anfrage, es wird in reag-native zusammengeführt und später expo.

@ucheNkadiCode Ich fürchte, ich benutze Expo nicht, aber es klingt so, als ob @sunnylqm weiß, wovon er spricht

Ich hatte gerade das gleiche Problem auf der Messe.
Ich habe versucht: Wächter Watch-Del-All && Expo R-C
aber jetzt noch gute nachrichten.

Ich habe das gleiche Problem, das verschwindet, wenn ich meinen TextInput in einen Text ändere.

Dieser Kommentar von vor 2 Jahren ist noch gültig.

Ich habe es auf ein <TextInput> eingegrenzt, das in einer FlatList gerendert wird. Wenn ich dies durch ein <Text> ersetze, verschwindet das Problem.

Das Zurücksetzen des Caches scheint kurz zu helfen, aber meine App stürzt nach ein paar Tastenklicks wieder ab.

@diegoboston Testen mit meiner hier .

Ich verwende das Expo SDK 37, das intern React Native 0.61 verwendet.
Es ist seltsam, dass ich überhaupt kein Problem hatte, aber plötzlich, als ich Builder neu startete, tauchte dieses Problem auf. Ist es noch nicht behoben?

RN 0.62.2 + Android hier gleich.
Dieser Fehler wird im Produktionsmodus aufgerufen.

image

Das Löschen des App-Cache aus den Einstellungen hat mein Problem behoben, aber das scheint keine akzeptable Lösung dafür zu sein.

Ich habe an diesem Thema gearbeitet und dies sind meine Ergebnisse (vorheriger Beitrag ist hier ).

1) Wir wissen, dass das Hinzufügen von android:editTextBackground mit color/transparent zum Thema das Problem behebt

<item name="android:editTextBackground"><strong i="10">@android</strong>:color/transparent</item>

2) Das Ändern der ReactEditTextShadowNode -Methode createDummyEditText auf den folgenden Code behebt ebenfalls das Problem (scheint mir, dass alle Stile für EditText deaktiviert sind).

<strong i="16">@Override</strong>
 protected EditText createDummyEditText() {
   return new EditText(getThemedContext(), null, 0);
 }

Ich verstehe dieses Problem jetzt so, dass Sie in Android Stile auf zwei Arten festlegen können

1) Schreiben Sie XML wie HTML-Elemente und -Stile und wenden Sie sie an
2) Rufen Sie den Konstruktor EditText oder View und übergeben Sie den Kontext und andere Attribute / Stile damit.

ReactEditText verwendet createDummyEditText , um eine EditText Instanz zu erstellen und dann einige Stile (Auffüllen, Layout usw.) zu ändern. Dies hängt jedoch mit dem Layout (Auffüllen, Ränder) und zusammen Keine Hintergrundfarben usw. Tatsächlich habe ich versucht, diese Codezeilen in setBackgroundTint in red oder transparent ändern, und es hat nicht funktioniert ...

https://github.com/facebook/react-native/blob/95546d932f03f9af990c2a11576a4c6297136fd4/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputShadN

Die Hintergrundfarbe wird mit der folgenden Methode geändert

https://github.com/facebook/react-native/blob/95546d932f03f9af990c2a11576a4c6297136fd4/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewBackgroundManager.1

Am Montag werde ich erneut versuchen, die setBackgroundColor -Methode zu ändern und die Hintergrundfarbe zur Laufzeit transparent zu machen ... Das wäre mein erster Hinweis, um dieses Problem zu lösen

Der Stapel schlägt bei createInternalEditText fehl

  /**
   * May be overriden by subclasses that would like to provide their own instance of the internal
   * {<strong i="9">@code</strong> EditText} this class uses to determine the expected size of the view.
   */
  protected EditText createInternalEditText() {
    return new EditText(getThemedContext());
  }

createInternalEditText ist die letzte Methode, die vor dem Fehler aufgerufen wurde. Der Rest des Stapels stammt aus der OpenSource-Bibliothek von Android SDK und ist nicht die eigentliche Ursache des Problems

Das Festlegen von android:editTextBackground ist wahrscheinlich über das Übersteuern einiger Elementwerte aus dem Standardthema hinaus, das das Problem verursacht. Das Problem hängt damit zusammen, dass der Konstruktor getThemedContext übergibt, der auch das Thema enthält

<item name="android:editTextBackground"><strong i="17">@android</strong>:color/transparent</item>

Aus diesem Grund glaube ich, dass die Lösung danach gesucht werden sollte, wie React mit dem Kontext umgeht ...

Leute, die den Packager neu gestartet und den Cache geleert haben, haben bei mir funktioniert!

Aber dies ist die vorübergehende Lösung. Wie kann ich diese dauerhafte Lösung beheben?

Ich habe versucht, die Hintergrundfarbe in Java programmgesteuert auf transparent zu setzen, löst aber dennoch den Laufzeitfehler aus, der mich an den folgenden Code glauben lässt

<item name="android:editTextBackground"><strong i="6">@android</strong>:color/transparent</item>

ist nur übergeordnete Logik von

https://github.com/facebook/react-native/blob/9312313c3c6701490d728f912e0b0bbd16d91ad9/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputShadowL

Das ist eindeutig die Ursache für das Problem im Stapel

Diese Methode ist für die Einrichtung des Stils des EditText verantwortlich.

Das Problem ist, dass der ursprüngliche Issue-Stack ein anderes Protokoll zu haben scheint und nicht mit dem angehängten Testfall in Beziehung zu stehen scheint. Der folgende Stapel stammt von ReactEditText.onTouchEvent was bedeutet, dass der Benutzer TextInput berührt und der Fehler ausgelöst wird.

ORIGINAL LOG ERROR

java.lang.NullPointerException:
tempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference at
android.graphics.drawable.DrawableContainer$DrawableContainerState.getChild(DrawableContainer.java:888) at
android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:466) at
android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:104) at
android.graphics.drawable.Drawable.setState(Drawable.java:735) at
android.graphics.drawable.DrawableWrapper.onStateChange(DrawableWrapper.java:331) at
android.graphics.drawable.Drawable.setState(Drawable.java:735) at
android.graphics.drawable.LayerDrawable.onStateChange(LayerDrawable.java:1488) at
android.graphics.drawable.Drawable.setState(Drawable.java:735) at
android.view.View.drawableStateChanged(View.java:18002) at
android.widget.TextView.drawableStateChanged(TextView.java:4097) at
android.view.View.refreshDrawableState(View.java:18071) at
android.view.View.setPressed(View.java:8543) at
android.view.View.setPressed(View.java:8521) at
android.view.View.onTouchEvent(View.java:11218) at
android.widget.TextView.onTouchEvent(TextView.java:8467) at
com.facebook.react.views.textinput.ReactEditText.onTouchEvent(ReactEditText.java:150)

Andere Arten von Fehlern https://github.com/facebook/react-native/issues/17530#issuecomment -376917781

ANDERE LOG-FEHLER

Schwerwiegende Ausnahme: java.lang.NullPointerException: Versuch, die virtuelle Methode 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable $ ConstantState.newDrawable (android.content.res.Resources)' für eine Nullobjektreferenz bei android aufzurufen .graphics.drawable.DrawableContainer $ DrawableContainerState.createAllFutures (DrawableContainer.java:875) unter android.graphics.drawable.DrawableContainer $ DrawableContainerState.getOpacity (DrawableContainer.java:1158) : 433) unter android.graphics.drawable.InsetDrawable.getOpacity (InsetDrawable.java:258) unter android.view.View.computeOpaqueFlags (View.java:16791) unter android.view.View.setBackgroundDrawable (View.java:21710) bei android.view.View.setBackground (View.java:21603) bei android.view.View.(View.java:5547) bei android.widget.TextView.(TextView.java:1135) unter android.widget.EditText.(EditText.java:107) unter android.widget.EditText.(EditText.java:103) unter android.widget.EditText.(EditText.java:99) unter android.widget.EditText.(EditText.java:95) unter com.facebook.react.views.textinput.ReactEditText.(ReactEditText.java:92) unter com.facebook.react.views.textinput.ReactTextInputManager.createViewInstance (ReactTextInputManager.java:94) unter com.facebook.react.views.textinput.ReactTextInputManager.cectVan com.facebook.react.uimanager.ViewManager.createView (ViewManager.java:46) unter com.facebook.react.uimanager.NativeViewHierarchyManager.createView (NativeViewHierarchyManager.java:218) unter com.facebook.react.uimanager.Over. Führen Sie (UIViewOperationQueue.java:150) unter com.facebook.react.uimanager.UIViewOperationQueue $ DispatchUIFrameCallback.dispatchPendingNonBatchedOperations (UIViewOperationQueue.java:923) aus unter com.facebook.react.uimanager.GuardedFrameCallback.doFrame (GuardedFrameCallback.java:31) unter com.facebook.react.modules.core.ReactChoreographer $ ReactChoreographerDispatcher.doFrame (ReactChoreog rapher.java:136) bei com.facebook.react.modules.core.ChoreographerCompat $ FrameCallback $ 1.doFrame (ChoreographerCompat.java:107) bei android.view.Choreographer $ CallbackRecord.run (Choreographer.java:909) bei android. view.Choreographer.doCallbacks (Choreographer.java:723) unter android.view.Choreographer.doFrame (Choreographer.java:655) unter android.view.Choreographer $ FrameDisplayEventReceiver.run (Choreographer.java:897) unter android.os.Handler .handleCallback (Handler.java:789) unter android.os.Handler.dispatchMessage (Handler.java:98) unter android.os.Looper.loop (Looper.java:164) unter android.app.ActivityThread.main (ActivityThread). java: 6938) unter java.lang.reflect.Method.invoke (Method.java) unter com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:327) unter com.android.internal.os.ZygoteInit .main (ZygoteInit.java:1374)

Auf der anderen Seite frage ich mich, ob https://github.com/facebook/react-native/issues/17530#issuecomment -504044357 ein akzeptables Beispiel ist, da es den Fehler nicht manuell verursacht, indem man auf den TextInput klickt, sondern indem man es tut programmatisch..

Ich bin sicher, dass jemand in dieser Diskussion angemessene Nachforschungen anstellen und dieses Problem lösen wird. Vielen Dank und viel Glück! : smiley:

Leute, versucht erneut "npm install" auszuführen. Es hat bei mir funktioniert.

Ich habe versucht, <item name="android:editTextBackground"><strong i="5">@android</strong>:color/transparent</item> hinzuzufügen, und dies verhindert, dass die App abstürzt. Das Textfeld blinkt jedoch immer wieder zwischen groß und klein und ist unbrauchbar. Hat dies jemand anderes gehabt?

In meinem Fall verwende ich gestylte Komponenten, ich setze einen Requisitennamen auf "richtig", ich denke es ist etwas Besonderes, ich wechsle zu "isRight", um mein Problem zu lösen.

Nehmen Sie Release Build und testen Sie es auf der apk, die Sie diesen Fehler nie gesehen haben

Der ursprüngliche Kommentar berichtet über ein Problem, das durch den Analytics-Fehlerbericht verursacht wurde, und nicht über einen Entwicklungsfehler. Ich denke, wir müssen konzentriert bleiben.

Sie können beide und einen der Punkte ausprobieren, je nachdem, was für Ihre App funktioniert:

  1. Löschen Sie die Cache-Daten Ihrer App und lassen Sie sie neu laden
  2. Starten Sie den Server mit npm start --reset-cache neu

Es scheint, dass ein verwandtes Problem im Android-Projekt unter https://issuetracker.google.com/issues/37068452 vorliegt

  1. Erstellen Sie eine benutzerdefinierte Drawable-Implementierung, die getConstantState () nicht überschreibt.
  2. Erstellen Sie eine LayerDrawable-Instanz mit einer Instanz der benutzerdefinierten Zeichnung als untergeordnetes Element.
  3. Rufen Sie mutate () auf dem LayerDrawable auf.
    Drawable dummyDrawable = new Drawable() {
        <strong i="12">@Override</strong>
        public void draw(Canvas canvas) {
            canvas.drawColor(Color.RED);
        }
        <strong i="13">@Override</strong> public void setAlpha(int alpha) {}
        <strong i="14">@Override</strong> public void setColorFilter(ColorFilter cf) {}
        <strong i="15">@Override</strong> public int getOpacity() { return 0; }
    };
    LayerDrawable layerDrawable = new LayerDrawable(new Drawable[] { dummyDrawable });
    layerDrawable.mutate();

In unserem Fall wird der Laufzeitfehler in dieser Zeile von ReactEditText ausgelöst (erbt von AppCompatEditText )

https://github.com/facebook/react-native/blob/6ffb983f83afdee5d9290c683c5060d2a959818d/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java#L83

https://github.com/facebook/react-native/blob/6ffb983f83afdee5d9290c683c5060d2a959818d/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java#

https://github.com/facebook/react-native/blob/6ffb983f83afdee5d9290c683c5060d2a959818d/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java#L1

https://github.com/facebook/react-native/issues/17530#issuecomment -615131077

<TextInput style={styles.input} /> sendet die Informationen von der JavaScript-Laufzeit als JSON über die ReactNativeBridge an Android. Die Android Java-API verwendet die Informationen, um eine View -Instanz zu erstellen und sie auf dem Bildschirm aufzublasen (anzuzeigen).

Es wird ein Context -Objekt an den View -Konstruktor übergeben, der das Deaktivierungslayout für dieses <TextInput /> aufbläst. Dann ändern wir jedes Mal, wenn wir eine Requisite wie underlineColorAndroid ändern ruft zum Beispiel eine bestimmte Android-API-Methode auf. setUnderlineColorAndroid("red") und die Android-API kümmern sich um die Aktualisierung der Farbe von <TextInput /> .

image

Wenn 37068452 die Laufzeit verursacht, müssen wir mutating() a BackgroundDrawable indem wir möglicherweise underlineColor ändern, aber der Fehler wird im Konstruktor View ausgelöst, wenn Wir übergeben die Context .

Ich werde versuchen, den Android-Stack zu debuggen, aber zuerst werde ich versuchen, das vorliegende Beispiel in ein minimal reproduzierbares Beispiel umzuwandeln und alle Eigenschaften zu entfernen, die für die Reproduktion des Fehlers nicht wesentlich sind.

Ich konnte ein reproduzierbares Mindestbeispiel erstellen.
Das Problem wird durch die TextInput- Schlüsselstütze verursacht .

Das erneute Rendern einer großen Anzahl von TextInput-Komponenten mit der Schlüsselstütze führt zu einem Laufzeitfehler.
Die Anzahl von TextInput s scheint entscheidend zu sein, um den Absturz auszulösen.

   // Does not crash after testing for 5 minutes
    for (let i = 0; i < 5; i++) { ..
   // Crashes after 20 seconds
    for (let i = 0; i < 100; i++) { ..
   // Crashes after 1 second
    for (let i = 0; i < 1000; i++) { ..

Der Absturz wird nicht reproduziert, wenn Sie die TextInput -Taste entfernen. Ich werde nachforschen und versuchen, das Problem zu beheben. Führen Sie dieses Beispiel aus, um es zu reproduzieren.

import * as React from "react";
import { View, TextInput } from "react-native";

class App extends React.Component{
  state = { startKey: 0 };
  componentDidMount() {
    this.interval = setInterval(this.updateKey, 3000);
  }

  componentWillUnmount() {
    clearInterval(this.interval);
  }

  updateKey = () => {
    this.setState({
      startKey: this.state.startKey + 100
    });
  };

  render() {
    const textInputs = [];

    for (let i = 0; i < 100; i++) {
      const key = (this.state.startKey + i).toString();
      console.log("key", key);
      // REMOVE KEY PROP TO FIX THIS
      textInputs.push(
        <TextInput key={key} />
      );
    }

    return (
      <View>
        { textInputs }
      </View>
    );
  }
}

export default App;

Das gleiche Problem kann mit einer FlatList reproduziert werden, wenn Ihre data Requisite eine key , index oder id wie diese [{ key: "1"}, {key: "2"}, .. {key: "5000"}] . automatisch werden die key für Ihre Liste verwendet und verursachen die Laufzeit. Durch Entfernen dieser Schlüssel aus dem Array data wird der Fehler behoben und das automatische Caching entfernt.

https://github.com/facebook/react-native/blob/980900c6343b93259e46edd44b6f267aa534cde5/Libraries/Lists/FlatList.js#L122 -L123

import * as React from "react";
import { Text, FlatList, View, TextInput } from "react-native";

class App extends React.Component{
  state = { startKey: 0 };
  componentDidMount() {
    this.interval = setInterval(this.updateKey, 3000);
  }

  componentWillUnmount() {
    clearInterval(this.interval);
  }

  updateKey = () => {
    this.setState({
      startKey: this.state.startKey + 100
    });
  };

  render() {
    const textInputs = [];

    for (let i = 0; i < 5000; i++) {
      const notKey = (this.state.startKey + i).toString();
      console.log("key", notKey);
      // REMOVE KEY OR ID FIELD TO FIX THIS
      // replacing notKey with key will trigger the runtime
      textInputs.push(
        { notKey }
      );
    }

    return (
      <FlatList
        data={textInputs}
        renderItem={({item}) => <TextInput value={"testing"} />}
      />
    );
  }
}

export default App;

Das Problem scheint durch diese Codezeile verursacht zu werden. Ich habe die Zeile kommentiert und durch const key = 500; und der Fehler wurde nicht erneut reproduziert.

https://github.com/facebook/react-native/blob/980900c6343b93259e46edd44b6f267aa534cde5/Libraries/Lists/VirtualizedList.js#L802 -L802

Ein Beispiel ist, dass keyExtractor(item, ii) mit item = {"key":"450"} , ii = 50 und der Rückgabewert key = 450 den Absturz verursachen, aber ich glaube, dass dies nicht die wahre Ursache ist, sondern nur Anzeige, dass der Schlüssel das Problem verursacht. Ich werde das weiter untersuchen. Ich suche nach einer Anstellung. Vielen Dank. Ich wünsche dir ein schönes Wochenende.

| MIT RUNTIME |
|: -------------------------: |
| |

| OHNE RUNTIME |
|: -------------------------: |
| |

@ fabriziobertoglio1987 Ich habe eine ähnliche Schlussfolgerung https://github.com/facebook/react-native/issues/17530#issuecomment -573934341, dh im Zusammenhang mit dem erneuten Montieren / Instanziieren eines Edittextes. Zu diesem Zeitpunkt verstand ich nicht, warum der Texteingang neu erstellt / wiederhergestellt werden würde, wenn sie keinen Grund dazu zu haben schienen. Jetzt klingt es so, als ob Schlüssel die Ursache sein könnten.

Der Fehler wirft von hier aus

https://github.com/aosp-mirror/platform_frameworks_base/blob/53a9ccaa926945149b4546c67b50ce1ae88ba777/graphics/java/android/graphics/drawable/DrawableContainer.java#L875

Dabei ist das Array mDrawableFutures nicht null, aber einige seiner untergeordneten Elemente könnten null sein.

mDrawableFutures kann nur von anderen geklont werden

https://github.com/aosp-mirror/platform_frameworks_base/blob/8857e6b645f9b91f44c8ea0ab8f441c9c0d63da6/graphics/java/android/graphics/drawable/DrawableContainer.java#L800 -L820 -L820

was bedeutet, dass es nicht null war, als es geklont wurde, aber irgendwie wurden einige seiner untergeordneten Elemente danach zerstört.
Das Folgende ist meine Vermutung: Die Schlüsselrequisiten würden einen unterschiedlichen Prozess auslösen, der Schattenknoten für Texteingaben konstruieren würde. Und während des Prozesses würden die zeichnbaren Zustände geklont. Es kann jedoch eine Racebedingung / nicht threadsichere Operation geben, die einige der zeichnbaren Zustände zerstört hat, während sie möglicherweise noch verwendet werden. @ fabriziobertoglio1987

Vielen Dank

Ich glaube, das Problem hängt mit einigen schmutzigen Parametern zusammen, die bei Verwendung von key und React.PureComponent übergeben wurden.

https://github.com/facebook/react-native/blob/f00795dc90d05180014eeea4b3215b0166a90692/Libraries/Lists/VirtualizedList.js#L345 -L348

https://github.com/facebook/react-native/blob/f00795dc90d05180014eeea4b3215b0166a90692/Libraries/Lists/VirtualizedList.js#L820

https://github.com/facebook/react-native/blob/f00795dc90d05180014eeea4b3215b0166a90692/Libraries/Lists/VirtualizedList.js#L1254 -L1255

Sie haben Recht, tatsächlich tritt dieses Problem nur bei Verwendung der Komponente TextInput . Wenn Sie beispielsweise TextInput durch Text in renderItem ersetzen, wird dieses Problem behoben

<FlatList
  renderItem={({item}) => <TextInput value={"testing"} />}

Der Unterschied zwischen der Verwendung von Text und TextInput besteht darin, dass const element ein ForwardRef mit TextInput . Im folgenden Fall erstellt TextInput eine Laufzeit, wenn ein bestimmter Schlüssel erreicht wird. Ich habe auch underlineColorAndroid="transparent" und es ist nicht die Ursache des Fehlers, aber ich habe es in den Protokollen unten belassen.

https://github.com/facebook/react-native/blob/980900c6343b93259e46edd44b6f267aa534cde5/Libraries/Lists/VirtualizedList.js#L1985 -L1990

console.log("element", element);
//=> element <Text value="testing" />
//=> element <ForwardRef(TextInput) allowFontScaling={true} rejectResponderTermination={true} underlineColorAndroid="transparent" value="testing" />

TextInput gibt ein forwardRef zurück

https://github.com/facebook/react-native/blob/f00795dc90d05180014eeea4b3215b0166a90692/Libraries/Components/TextInput/TextInput.js#L1153

https://github.com/facebook/react-native/blob/f00795dc90d05180014eeea4b3215b0166a90692/Libraries/Components/TextInput/TextInput.js#L957 -L990

Ich glaube, eine Methode in der Java-API wird von der TextInput Javascript-API aufgerufen, aber mit fehlenden / schmutzigen Parametern. Dies kann den NPE-Laufzeitfehler verursachen, aber ich muss jeden Aspekt der JS TextInput-API untersuchen, um den Grund zu verstehen.

Ich denke, die key Requisite verursacht Probleme, weil der React Mechanismus auf dem Vergleich der key Requisite basiert. Wenn kein Schlüssel-Requisitenmechanismus vorhanden ist, dann kein Caching und anschließend kein Fehler .

Morgen werde ich versuchen, einen Haltepunkt in Ihrem Code festzulegen, auf den Sie in der obigen Nachricht verwiesen haben

Vielen Dank für die Hilfe. Hoffentlich können wir gemeinsam eine Pull-Anfrage schreiben und dieses Problem beheben. Ich wünsche dir einen guten Abend. Fabrizio

@sunnylqm

ZU LANG NICHT LESEN

Ich schreibe eine Pull-Anfrage, um dieses Problem zu beheben. Es ist sehr einfach zu beheben.

Das Problem wird durch das Standard-BackgroundDrawable verursacht, das bei der EditText-Initialisierung verwendet wird

https://github.com/facebook/react-native/blob/6ffb983f83afdee5d9290c683c5060d2a959818d/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java#L1

Das Drawable ist das aus dem Thema, das wir verwenden Theme.AppCompat.Light.NoActionBar . Das Ändern des Drawable kann durch Ändern der XML-Vorlagendateien erfolgen, die zum Initialisieren des reaktionsnativen Android-Projekts mit dem reaktionsnativen Init-Skript verwendet werden.

Ich werde entweder eines verwenden, das standardmäßig von Android bereitgestellt wird, oder ich werde ein benutzerdefiniertes Zeichen erstellen und es in jede Projektinitialisierung einbeziehen.

https://github.com/facebook/react-native/blob/2b56011f9cb9f90781428b5b773cbbed5c4fae43/template/android/app/src/main/res/values/styles.xml#L1 -L6

<item name="android:editTextBackground"><strong i="18">@android</strong>:drawable/edit_text</item>

oder

https://github.com/facebook/react-native/blob/2b56011f9cb9f90781428b5b773cbbed5c4fae43/template/android/app/src/main/res/values/styles.xml#L1 -L6

<item name="android:editTextBackground">@drawable/custom_background_drawable</item>

LANGE VERSION

Ich zitiere sunnylqm https://github.com/facebook/react-native/issues/17530#issuecomment -660506001

Das Folgende ist meine Vermutung: Die Schlüsselrequisiten würden einen unterschiedlichen Prozess auslösen, der Schattenknoten für Texteingaben konstruieren würde. Und während des Prozesses würden die zeichnbaren Zustände geklont. Es kann jedoch eine Racebedingung / nicht threadsichere Operation geben, die einige der zeichnbaren Zustände zerstört hat, während sie möglicherweise noch verwendet werden.

Diese Zeile android:editTextBackground behebt den Fehler, aber WAS macht diese Zeile in ReactNative?

1) Das AndroidManifest.xml weist das android:theme="@style/AppTheme"

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.awesomeproject">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
      android:name=".MainApplication"
      android:theme="@style/AppTheme">

2) Wir ändern die AppTheme in res/values/styles.xml

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="android:textColor">#000000</item>
        <item name="android:editTextBackground"><strong i="22">@android</strong>:drawable/edit_text</item>
    </style>
</resources>

3) Der Konstruktor EditText ruft super(context) . Das context -Objekt enthält die layout und theme ( AppTheme ).

Der Konstruktor View erhält die Informationen zu Stil / Thema / Layout aus dem Objekt context und erstellt mit diesen Stilen eine Instanz von EditText (xml ist wie HTML), bläst sie auf und Zeigen Sie es auf dem Bildschirm an.

Android verwendet XML wie HTML, um statische Ansichten zu rendern, während Java zum Rendern von dynamischen Inhalten verwendet wird (wie JavaScript im Web).

https://github.com/facebook/react-native/blob/6ffb983f83afdee5d9290c683c5060d2a959818d/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java#L1

4) ReactNative baut auf der Context API auf, verwendet jedoch das gleiche Muster von 1-3.
Initialisieren Sie die Ansichten mit dem Objekt context und nehmen Sie dann mit JavaScript dynamische Änderungen vor, ohne die Instanz context direkt zu ändern, sondern verwenden Sie die Brücke react-native über die Android-API.

| VOR | NACH | NACH mit TextInput-Requisiten |
|: -------------------------: |: -------------------- -----: |: -------------------------: |
| | | |

Ich bereite eine Pull-Anforderung vor , um das Standard-Drawable zu ändern, das bei der Initialisierung für EditText verwendet wird.
Das Drawable from Theme Theme.AppCompat.Light.NoActionBar verursacht dieses Problem. Wenn Sie es durch ein anderes Drawable ersetzen, sollte es behoben werden. Das ziehbare <strong i="27">@android</strong>:drawable/edit_text ist zu hoch für unser Design. Die übergeordnete Ansicht wird an die standardmäßige Zeichenhöhe angepasst, wenn die Höhe des übergeordneten Elements höher ist. Ich glaube, ReactNative verwendet eine Standardzeichnung mit geringer Höhe und passt sie dann mit match_parent an die übergeordnete Ansicht an.

1) OPTION 1 - Finden Sie eine Zeichnung aus einem anderen Thema

2) OPTION 2
Erstellen Sie eine neue Zeichnungsdatei in der reaktionsnativen Vorlage, die auf der im Android-Projekt verfügbaren Vorlage mit geringer Höhe für immer match_parent View basiert.

Ich habe meinem Android-Projekt das Folgende hinzugefügt, das mit einer Höhe von wenigen Pixeln gezeichnet werden kann

Screenshot from 2020-07-20 13-34-54

Der Hintergrund, der gezeichnet werden kann, passt sich der übergeordneten Ansichtshöhe von 10 an

Der zeichnbare Hintergrund passt sich der übergeordneten Ansichtshöhe von 100 an

scheint mit kleinen Hintergrund-Drawables zu funktionieren, dann benötigen wir nur das Skript react-native init , um Projekte mit diesem Hintergrund zu initialisieren, der standardmäßig gezeichnet werden kann. Ich werde die obigen expliziten Änderungen zu den Dateien unten in einer Pull-Anfrage hinzufügen.

https://github.com/facebook/react-native/blob/2b56011f9cb9f90781428b5b773cbbed5c4fae43/template/android/app/src/main/res/values/styles.xml#L1 -L6

Vielen Dank. Fabrizio

Das gleiche Problem mit RN 0.61.0 + Android API Level 28.
Ich habe es auf eine Kombination aus Flatlist-, TextInput- und verschachtelten Komponenten-Renderings eingegrenzt

@ fabriziobertoglio1987 Ich habe es auf diese Weise versucht, aber vielleicht habe ich etw verpasst, dass ich es nicht zum Laufen gebracht habe. Ich weiß wenig über Android und ich bin froh, dass Sie es beheben können. Während ich mich noch für das Thema der wichtigsten Requisiten interessiere.

@ fabriziobertoglio1987 Gibt es überhaupt einen nativen js-Code, den ich hinzufügen kann, um dieses Problem schnell zu beheben? Gib mir Bescheid.

@ asmi24886 können Sie eine Testkomponente zu finden , um zuverlässig um dieses Problem zu reproduzieren und eine nativen Code / Konfiguration Abhilfe in meinem Kommentar hier
Ich glaube nicht, dass es eine Problemumgehung gibt, bei der nur JS-Code verwendet wird.

Dies ist die Fortsetzung meiner vorherigen Nachricht https://github.com/facebook/react-native/issues/17530#issuecomment -660908150, meine Bemühungen, einen freiberuflichen Job zu finden und die Pull-Anfrage zu schreiben, um dieses Problem zu schließen.

Ich habe ein benutzerdefiniertes Zeichen basierend auf Theme.AppCompat.Light .

<inset xmlns:android="http://schemas.android.com/apk/res/android"
       android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
       android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
       android:insetTop="@dimen/abc_edit_text_inset_top_material"
       android:insetBottom="@dimen/abc_edit_text_inset_bottom_material">

    <selector>
        <item android:state_enabled="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
        <item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
        <item android:drawable="@drawable/abc_textfield_activated_mtrl_alpha"/>
    </selector>

</inset>

Die Laufzeit wird durch den folgenden Eintrag verursacht. Wenn ich diese Zeile entferne, funktioniert eine exakte Kopie des aktuellen Drawable von react-native und löst den Laufzeitfehler nicht aus. Ich habe das minimal reproduzierbare Beispiel in mein https://github.com/facebook/react-native/issues/17530#issuecomment -660017858 aufgenommen

<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>

Ich schreibe eine Pull-Anfrage. Sobald die Pull-Anfrage zusammengeführt ist, können Sie ein Upgrade mit dem Upgrade-Helfer durchführen .

Die Pull-Anforderung enthält eine Reproduktion dieser Szenarien in der RNTester-Anwendung, Änderungen an der Vorlage und das Hinzufügen der oben genannten benutzerdefinierten Zeichen, um dieses Problem zu vermeiden.

https://github.com/facebook/react-native/blob/2b56011f9cb9f90781428b5b773cbbed5c4fae43/template/android/app/src/main/res/values/styles.xml#L1 -L6

Dies ist ein Video, das den Laufzeitfehler zeigt, wenn das Drawable die Zeile <item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>

Dies ist ein Video, das den Fix zeigt (kein Laufzeitfehler), wenn das Drawable keine Zeile <item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>

Wie im folgenden Screenshot gezeigt, entferne ich nur die folgende Zeile aus der zeichnbaren XML-Datei
xml <item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
Ich ändere den Stil nicht. Das Drawable ist dasselbe, das von AppCompat verwendet wird, und der Stil ist derselbe, löst jedoch keinen Laufzeitfehler aus

Ich werde versuchen, die Pull-Anfrage morgen zu veröffentlichen .

Vielen Dank sunnylqm für die Zusammenarbeit mit mir, um https://github.com/facebook/react-native/pull/29452 zu schreiben, mit dem dieses Problem behoben wird .

In einigen Geräten / Android-Betriebssystemversionen scheint es einen Fehler in Drawable.mutate () zu geben, selbst nachdem Sie den konstanten Status überprüft haben. Dieser Fehler ist schwer zu reproduzieren und zu beheben. Versuchen Sie daher, die Ausnahme abzufangen, um einen Absturz zu verhindern.

Das Problem wird durch diese Zeile in extras / android / support / v7 / appcompat / res / drawable / abc_edit_text_material.xml verursacht .

<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>

In der obigen Zeile wird ein StateListDrawable erstellt, das das Hintergrundbild TextInput (Hintergrund zeichnbar ) abhängig vom Status des TextInput ändert .

state_pressed="false" und state_focused="false" lösen eine Änderung des TextInput BackgroundDrawable aus. Die Bilder sind nicht die Ursache des Problems, aber ich habe sie zu Dokumentationszwecken beigefügt.

| abc_textfield_activated_mtrl_alpha | abc_textfield_default_mtrl_alpha |
|: -------------------------: |: -------------------- -----: |
| | |

Innerhalb von DrawableContainer.getChild () ist die ConstantState-Variable cs null . Das Aufrufen von null.newDrawable(mSourceRes) löst eine Nullzeiger-Ausnahme aus. Dieser Aufruf ist das Ergebnis der Statusänderung des TextInput in diesem Stack-Trace nach dem Drücken.

mDrawableFutures enthält nicht die korrekte Liste der Einträge https://github.com/facebook/react-native/pull/29452#issuecomment -662616018.

final ConstantState cs = mDrawableFutures.valueAt(keyIndex);
final Drawable prepared = prepareDrawable(cs.newDrawable(mSourceRes));

Weitere Informationen in den vorherigen Kommentaren https://github.com/facebook/react-native/issues/17530#issuecomment -661174770 https://github.com/facebook/react-native/issues/17530#issuecomment -660908150 https: //github.com/facebook/react-native/issues/17530#issuecomment -660506001 https://github.com/facebook/react-native/issues/17530#issuecomment -660458191 https://github.com/facebook/ React-Native / Issues / 17530 # Issuecomment -660017858 https://github.com/facebook/react-native/issues/17530#issuecomment -659422298 https://github.com/facebook/react-native/issues/17530# Issuecomment -645851033 https://github.com/facebook/react-native/issues/17530#issuecomment -632795323

Vielen Dank
Ich wünsche dir einen schönen Tag
Fabrizio

@ fabriziobertoglio1987 Handelt es sich bei dem obigen Kommentar um eine

@Coffeegerm Der obige Kommentar https://github.com/facebook/react-native/issues/17530#issuecomment -662000718 ist eine kurze Erklärung, wie meine Pull-Anfrage https://github.com/facebook/react-native/pull / 29452 behebt dieses Problem. Sobald die Pull-Anforderung in React-Native zusammengeführt ist

1) Neue Apps haben diesen Fehler nicht
2) Bestehende Apps werden aktualisiert und der Fehler tritt nicht auf. Weitere Informationen zum Aktualisieren finden Sie unter Aktualisieren von # 3-Upgrade-Your-Project-Dateien , um mehr darüber zu erfahren, wie Sie die Änderungen in Ihrem Ordner /android anwenden, wenn Sie Ihre Anwendung aktualisieren.

Wenn Sie kein Upgrade durchführen möchten, können Sie meine PR unter https://github.com/facebook/react-native/pull/29452 überprüfen und diese Änderungen Ihrem Projektordner android hinzufügen. Sie müssen keine Änderungen am react-native Quellcode vornehmen, da sich die Konfigurationsänderungen von diesem PR nicht in der /ReactAndroid Java-Codebasis befinden, sondern in der Android Vorlage, die zum Initialisieren verwendet wird das Projekt.

Ich arbeite derzeit an anderen Problemen, werde aber zurückkommen, auf Feedback antworten und notwendige Verbesserungen an meiner Pull-Anfrage vornehmen.

Bitte kommen Sie mit Verbesserungsvorschlägen und Feedback zu mir zurück.

Ich wünsche dir ein schönes Wochenende
Vielen dank für Deine Hilfe
Fabrizio

Ich habe gerade ein Commit gesehen, das sich nach https://github.com/facebook/react-native/commit/1e4d8d902daca8e524ba67fc3c1f4b77698c4d08 anhört

Wir haben streng zu viele redundante Create + Delete-Vorgänge generiert, die Konsistenzprobleme, Abstürze oder Fehler auf Plattformen verursachen können, die dies nicht ordnungsgemäß handhaben.
zumal die Reihenfolge des Erstellens + Löschens nicht garantiert ist (eine reparierte Ansicht könnte "zuerst" erstellt werden und der Unterschied könnte später ein "Löschen" für dieselbe Ansicht ausgeben).

@ fabriziobertoglio1987

Haben Sie eine Idee, wie jemand dieses Problem während der Nutzung von Expo beheben kann, also ohne Zugriff auf den Android-Ordner des Projekts? 😅

@divonelnc Es gibt eine

<TextInput key={Math.random()} />

Und natürlich kann es zu anderen Problemen und Leistungseinbußen kommen.

@sunnylqm Leider hat das nicht geholfen 😞. Ich habe es immer noch zufällig auf dem Bildschirm mit Dutzenden von Texteingaben abgestürzt.

Ich kann dieses Problem in der Produktion bestätigen! RN: 0,62,2 😕

Das gleiche Problem trat in RN 0.63.2 auf :(

Wow das war frustrierend. @WilliamAlexander @ Hopding- Lösung funktioniert. Ich weiß es, weil ich es jedes Mal vorher tadeln konnte.
// styles.xml

<resources>
   <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="android:editTextStyle">@style/AppEditTextStyle</item>
        <item name="editTextStyle">@style/AppEditTextStyle</item> <!-- For compatibility with the support library -->
        <item name="android:editTextBackground"><strong i="9">@android</strong>:color/transparent</item>

    </style>

    <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
        <item name="android:background"><strong i="10">@android</strong>:color/transparent</item>
    </style>
</resources>

Hier ist eine ziemlich gute Problemumgehung. Erstellen Sie einen Wrapper für die von Ihnen verwendete Texteingabekomponente und generieren Sie mit useMemo einen Schlüssel dafür. Auf diese Weise hat eine einzelne Texteingabe beim erneuten Rendern immer denselben Schlüssel, und Sie müssen auch nicht für alle Texteingaben Schlüssel schreiben.

export default (props: TextInputProps) => {
  const key = useMemo(() => {
    return Math.random().toString()
  }, [])

  return (
    <TextInput key={key} {...props} />
  )
}

Wenn Sie expo verwenden
Ich habe diesen Fehler nach dem Upgrade von Expo SDK 38 auf 39 erhalten.
Ich musste sowohl meinen Expo-Cache (expo -rc) als auch den Expo-Cache für mobile Apps bereinigen (ich deinstalliere ihn und installiere ihn erneut, um sicherzugehen), und der Fehler war verschwunden.

@dpnick der Fehler ist sehr schwer zu reproduzieren. Ich schlage vor, die hier veröffentlichte

Wenn dieser Fehler in der Produktion auftritt und ich dieses Problem nicht reproduzieren kann, ist meine RN-Version 0.62.2. Hier sind meine Protokolle von Firebase-Crashlytics:

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' on a null object reference
       at android.graphics.drawable.DrawableContainer$DrawableContainerState.createAllFutures(DrawableContainer.java:880)
       at android.graphics.drawable.DrawableContainer$DrawableContainerState.getOpacity(DrawableContainer.java:1163)
       at android.graphics.drawable.DrawableContainer.getOpacity(DrawableContainer.java:434)
       at android.graphics.drawable.InsetDrawable.getOpacity(InsetDrawable.java:259)
       at android.view.View.computeOpaqueFlags(View.java:19424)
       at android.view.View.setBackgroundDrawable(View.java:24701)
       at android.view.View.setBackground(View.java:24594)
       at android.view.View.<init>(View.java:6191)
       at android.widget.TextView.<init>(TextView.java:1223)
       at android.widget.EditText.<init>(EditText.java:106)
       at android.widget.EditText.<init>(EditText.java:102)
       at android.widget.EditText.<init>(EditText.java:98)
       at android.widget.EditText.<init>(EditText.java:94)
       at com.facebook.react.views.textinput.ReactTextInputShadowNode.createInternalEditText(ReactTextInputShadowNode.java:258)
       at com.facebook.react.views.textinput.ReactTextInputShadowNode.setThemedContext(ReactTextInputShadowNode.java:78)
       at com.facebook.react.uimanager.UIImplementation.createView(UIImplementation.java:243)
       at com.facebook.react.uimanager.UIManagerModule.createView(UIManagerModule.java:469)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372)
       at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:151)
       at com.facebook.react.bridge.queue.NativeRunnable.run(NativeRunnable.java)
       at android.os.Handler.handleCallback(Handler.java:883)
       at android.os.Handler.dispatchMessage(Handler.java:100)
       at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:27)
       at android.os.Looper.loop(Looper.java:237)
       at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:226)
       at java.lang.Thread.run(Thread.java:919)

@AbdelkhalekESI Der Fehler ist sehr schwer zu reproduzieren. Haben Sie die Testkomponente ausprobiert, die ich hier gepostet

Ich habe eine Pull-Anfrage geschrieben, die dieses Problem behebt: https://github.com/facebook/react-native/issues/17530#issuecomment -663577143

Bitte gehen Sie zu pr https://github.com/facebook/react-native/pull/29452 und folgen Sie den Anweisungen https://github.com/facebook/react-native/wiki/Building-from-source#publish - Ihre eigene Version von React-Native und lassen Sie mich wissen, wenn Sie Hilfe benötigen. Ich werde dieses Wochenende versuchen zu überprüfen, ob ein separater PR für die Expo geschrieben werden muss, aber ich glaube, dass sie das Problem nur durch ein Upgrade des Reaktivs beheben können, sobald dieser PR zusammengeführt und veröffentlicht wird. Vielen Dank. Ich wünsche Ihnen eine gute Nacht

Weitere Informationen in meinen vorherigen Beiträgen https://github.com/facebook/react-native/issues/17530#issuecomment -662000718

Gleiches Problem in Version "react-native": "0.63.3"

Leeren Sie einfach Ihren Expo-Cache in der mobilen Anwendung (wenn Sie eine mobile Anwendung verwenden) oder den Cache der Expo-Anwendung in einer beliebigen Plattform, die Sie verwenden.

@ tzeneng96 ok, das Löschen des Caches funktioniert mit der App, ist aber keine akzeptable Lösung, da das Problem erneut auftritt!

@AbdelkhalekESI Der Fehler ist sehr schwer zu reproduzieren. Haben Sie die Testkomponente ausprobiert, die ich hier gepostet

Ich konnte diesen Fehler mit dieser Komponente reproduzieren. Ich habe auch viele Protokolle dieses Absturzes in der Produktion erhalten. Das Projekt hat derzeit auf Version 0.63.3 reagiert.

Ich weiß nicht, ob ich etwas falsch gemacht habe, aber in diesem von @ glenn-axsy zitierten Thema haben sie es meines Wissens geschafft, durch Hinzufügen von andoid \ app \ src \ main \ res \ values ​​\ styles.xml zu lösen der Gegenstand:
"item name =" android: editTextBackground "> @ android: color / transparent / item"

Ich teste immer noch die Lösung.

@thiagocristianno Ihr Verständnis ist korrekt, obwohl es keine perfekte Lösung ist und ich glaube, es hilft Expo-Entwicklern nicht, da sie diese Einstellung nicht kontrollieren können.

Wow das war frustrierend. @WilliamAlexander @ Hopding- Lösung funktioniert. Ich weiß es, weil ich es jedes Mal vorher tadeln konnte.
// styles.xml

<resources>
   <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="android:editTextStyle">@style/AppEditTextStyle</item>
        <item name="editTextStyle">@style/AppEditTextStyle</item> <!-- For compatibility with the support library -->
        <item name="android:editTextBackground"><strong i="10">@android</strong>:color/transparent</item>

    </style>

    <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
        <item name="android:background"><strong i="11">@android</strong>:color/transparent</item>
    </style>
</resources>

@ @jordangrant , wo haben Sie die Problemumgehung gesehen?

Wow das war frustrierend. @WilliamAlexander @ Hopding- Lösung funktioniert. Ich weiß es, weil ich es jedes Mal vorher tadeln konnte.
// styles.xml

<resources>
   <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="android:editTextStyle">@style/AppEditTextStyle</item>
        <item name="editTextStyle">@style/AppEditTextStyle</item> <!-- For compatibility with the support library -->
        <item name="android:editTextBackground"><strong i="11">@android</strong>:color/transparent</item>

    </style>

    <style name="AppEditTextStyle" parent="@style/Widget.AppCompat.EditText">
        <item name="android:background"><strong i="12">@android</strong>:color/transparent</item>
    </style>
</resources>

@ @jordangrant , wo haben Sie die Problemumgehung gesehen?

@bobowinca Dies ist ein extrem langer Thread und diese Lösung hat zu 100% für mich funktioniert. RN 63.3 keine Expo

Screen Shot 2020-11-18 at 1 18 45 PM

@ Jordanangrant , Doh! Schauen Sie immer bevor Sie fragen. Ich habe versagt. Vielen Dank, Sir.

Klingt auch so, als ob Sie das Problem konsistent reproduzieren konnten. Ich frage mich, wie du das machst. Ich habe bisher nur Stack Trace gesehen. Ich finde heraus, wie ich das Update überprüfen kann.

@bobowinca Die hier gepostet

@bobowinca Die hier gepostet

klappt wunderbar! Danke Glenn!

Das Hinzufügen von <item name="android:editTextBackground"><strong i="5">@android</strong>:color/transparent</item> zu styles.xml funktioniert!
Die Methode zum Hinzufügen zu key={Math.random().string()} TextInput funktionierte, aber beim erneuten Rendern wird die Tastatur jedes Mal nach der Sekunde ausgeblendet - dies war nicht akzeptabel.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen