Attempt to invoke virtual method 'void com.facebook.react.uimanager.UlManagerModule.onBatchComplete()' on a null object reference
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
Línea de trabajo
Comienza inspeccionando react-native-ui-lib/react-native.config.js y RuntimeUtils.java en uilib-native/android/src/main/java/com/wix/reactnativeuilib/keyboardinput/utils/. Reproduce la interacción del teclado de Android con las versiones indicadas de React Native y del paquete, y verifica después que ambas fuentes del paquete estén actualizadas y que el fallo ya no se produzca cuando UIManagerModule no esté disponible.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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
- Lenguaje dominante
- TypeScript
- Estrellas
- 7.2k
- Forks
- 749
- Merge medio
- 29 min
- PR fusionados (30 d)
- 1
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de wix/react-native-ui-lib
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
wix/react-native-ui-lib#4022 ·
Los mantenedores suelen responder en 1 día
-
SortableGridList does not forward props to its inner ScrollView (inconsistent with SortableList)Posiblemente ocupada @yinminqian la tomó hace 173 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
wix/react-native-ui-lib#4002 ·
Los mantenedores suelen responder en 1 día
-
RN 0.85.0 StyleSheet.absoluteFillObject is removedPosiblemente ocupada @ChrisJamesC la tomó hace 80 días. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
wix/react-native-ui-lib#3965 · 3 comentarios · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
asBaseComponent: stale module-level colorScheme prevents re-render on scheme switch backPosiblemente ocupada @huytdps13400 la tomó hace 34 días. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
wix/react-native-ui-lib#3945 ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
wix/react-native-ui-lib#4044 · 1 comentario ·
Los mantenedores suelen responder en 1 día
Todos los issues de wix/react-native-ui-lib
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
-
documentation easy good first issue help wanted
Dificultad 1/5 1-3 horas Aptitud para principiantes 83/100
Los mantenedores suelen responder en 1 día
-
Billion-context documentation addendum: nudge is independent of window occupancy. | billion-context 文档补充:nudge 与窗口占用无关Posiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 1/5 1-3 horas Aptitud para principiantes 86/100
ranxianglei/billion-context#5893 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 79/100
microsoft/monaco-editor#5575 ·
Los mantenedores suelen responder en 1 día
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100