Attempt to invoke virtual method 'void com.facebook.react.uimanager.UlManagerModule.onBatchComplete()' on a null object reference
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 35/100
Direzione di ricerca
Inizia esaminando react-native-ui-lib/react-native.config.js e RuntimeUtils.java in uilib-native/android/src/main/java/com/wix/reactnativeuilib/keyboardinput/utils/. Riproduci l’interazione con la tastiera Android usando le versioni indicate di React Native e del package, quindi verifica che entrambe le sorgenti del package siano aggiornate e che il crash non si verifichi più quando UIManagerModule non è disponibile.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Description
Android crashes due to NullPointerException in RuntimeUtils.java when using the keyboard input features. The issue stems from the React Native UI Lib package's dependency structure for Android, where patches need to be applied to both react-native-ui-lib AND uilib-native packages.
Related to
- Components
- Demo
- Docs
- Typings
Steps to reproduce
- Use
react-native-ui-libin a React Native application - Implement components that use keyboard-related features
- Run on Android
- App crashes with
NullPointerExceptioninRuntimeUtils.javaduring keyboard interaction - Apply patch to
react-native-ui-libbut crashes continue
Expected behavior
The app should handle keyboard interactions properly without crashing.
Actual behavior
The app crashes with errors like:
Fatal Exception: java.lang.NullPointerException
Attempt to invoke virtual method 'void com.facebook.react.uimanager.UIManagerModule.onBatchComplete()' on a null object reference
at com.wix.reactnativeuilib.keyboardinput.utils.RuntimeUtils$1.run(RuntimeUtils.java:13)
More Info
Root Cause Analysis
The root cause of this issue is a non-obvious relationship between react-native-ui-lib and uilib-native packages.
When building the Android app, the react-native-ui-lib package doesn't use its own native Android code. Instead, it points to the uilib-native package's Android code, as configured in react-native-ui-lib/react-native.config.js:
// node_modules/react-native-ui-lib/react-native.config.js
module.exports = {
dependency: {
platforms: {
android: {
sourceDir: "../uilib-native/android/",
// Other config...
},
},
},
};
This means that patching only react-native-ui-lib doesn't affect the Android build, since it's actually using code from uilib-native.
Code snippet
Original problematic code in uilib-native:
// node_modules/uilib-native/android/src/main/java/com/wix/reactnativeuilib/keyboardinput/utils/RuntimeUtils.java
package com.wix.reactnativeuilib.keyboardinput.utils;
import com.facebook.react.uimanager.UIManagerModule;
import com.wix.reactnativeuilib.keyboardinput.ReactContextHolder;
public class RuntimeUtils {
private static final Runnable sUIUpdateClosure = new Runnable() {
@Override
public void run() {
ReactContextHolder.getContext().getNativeModule(UIManagerModule.class).onBatchComplete();
}
};
public static void runOnUIThread(Runnable runnable) {
if (ReactContextHolder.getContext() != null) {
ReactContextHolder.getContext().runOnUiQueueThread(runnable);
}
}
public static void dispatchUIUpdates(final Runnable userRunnable) {
runOnUIThread(new Runnable() {
@Override
public void run() {
userRunnable.run();
if (ReactContextHolder.getContext() != null) {
ReactContextHolder.getContext().runOnNativeModulesQueueThread(sUIUpdateClosure);
}
}
});
}
}
Fixed version with proper null checks:
package com.wix.reactnativeuilib.keyboardinput.utils;
import android.util.Log;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.uimanager.UIManagerModule;
import com.wix.reactnativeuilib.keyboardinput.ReactContextHolder;
public class RuntimeUtils {
private static final Runnable sUIUpdateClosure = new Runnable() {
@Override
public void run() {
try {
ReactContext context = ReactContextHolder.getContext();
if (context != null) {
UIManagerModule uiManager = context.getNativeModule(UIManagerModule.class);
if (uiManager != null) {
uiManager.onBatchComplete();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
public static void runOnUIThread(Runnable runnable) {
try {
if (ReactContextHolder.getContext() != null) {
ReactContextHolder.getContext().runOnUiQueueThread(runnable);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void dispatchUIUpdates(final Runnable userRunnable) {
if (ReactContextHolder.getContext() == null) {
return; // Skip if context is null
}
try {
runOnUIThread(new Runnable() {
@Override
public void run() {
try {
// Re-check context before running user code
if (ReactContextHolder.getContext() != null) {
userRunnable.run();
// Get a fresh context reference before queue operation
ReactContext context = ReactContextHolder.getContext();
if (context != null) {
context.runOnNativeModulesQueueThread(sUIUpdateClosure);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
Solution
To fix this issue, you need to patch both packages using patch-package:
- First, patch
react-native-ui-lib - Then, patch
uilib-native - Apply both patches using
patch-packagein your postinstall script
Example patches are provided in the code snippets above.
Verification
To verify that patches are correctly applied:
- Check that both package source files contain your patches
- Add Log statements in the patched code (like
Log.d("TAG", "message")) - Monitor the Android logs during app execution to confirm the patched code is running
Screenshots/Video
N/A
Environment
- React Native version: 0.76.x
- React Native UI Lib version: 7.38.1
- uilib-native version: 4.5.1 (indirectly used by react-native-ui-lib)
Affected platforms
- Android
- iOS
- Web
Reference: https://github.com/facebook/react-native/issues/47662
- Lingua principale
- TypeScript
- Stelle
- 7.2k
- Fork
- 749
- Merge medio
- 29m
- PR unite (30g)
- 1
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di wix/react-native-ui-lib
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
wix/react-native-ui-lib#4022 ·
I maintainer di solito rispondono entro 1 giorno
-
SortableGridList does not forward props to its inner ScrollView (inconsistent with SortableList)Forse già presa @yinminqian l’ha presa 172 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
wix/react-native-ui-lib#4002 ·
I maintainer di solito rispondono entro 1 giorno
-
RN 0.85.0 StyleSheet.absoluteFillObject is removedForse già presa @ChrisJamesC l’ha presa 79 giorni fa. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
wix/react-native-ui-lib#3965 · 3 commenti · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
asBaseComponent: stale module-level colorScheme prevents re-render on scheme switch backForse già presa @huytdps13400 l’ha presa 33 giorni fa. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
wix/react-native-ui-lib#3945 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
wix/react-native-ui-lib#4044 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di wix/react-native-ui-lib
Issue simili
-
Navbar avatar and name stay stale after saving profile changesForse già presa @alexechoi l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
marmelab/atomic-crm#416 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
epam/ai-dial-react-file-manager#99 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
canonical/craft-actions#146 ·
I maintainer di solito rispondono entro 2 giorni
-
feature-request
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
bluesky-social/social-app#12343 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
lucide-icons/lucide#5165 ·
I maintainer di solito rispondono entro 1 giorno