Сохранение SplashScreen до тех пор, пока react native bundle не будет загружен в android
я следовал руководству android в этой статье Как добавить заставку в родное приложение React
и дошел до того, что у меня есть моя активность SplashScreen перед моей основной деятельностью, т. е. в то время как android-приложение раздувается.
до сих пор так хорошо, но есть мерцание белого цвета, вызванное реакцией родной загрузки JS bundle, которую я хотел бы удалить. Статья предлагает использовать react-native-splash-screen
библиотека, однако я хотел бы сохранить свои зависимости в минимальный.
React native documentation имеет это Pro Tip это по существу достигает того, что я ищу, но в iOS (он продолжает показывать заставку, пока пакет не загружен). Я пытаюсь понять, как я бы сделал что-то подобное в родной java для android, но пока не повезло.
2 ответов
вот способ сделать это, когда контент добавляется React:
=== MainActivity.java ===
import com.facebook.react.*;
import android.content.Context;
import android.app.Activity;
import android.util.Log;
import android.view.View;
public class MainActivity extends ReactActivity {
class CustomReactActivityDelegate extends ReactActivityDelegate {
class CustomReactRootView extends ReactRootView {
public CustomReactRootView(Context context) {
super(context);
}
@Override
public void onViewAdded(View child) {
super.onViewAdded(child);
Log.d("React views started to appear", "Static js code has already run");
}
}
private Activity currentActivity;
public CustomReactActivityDelegate(Activity activity, String mainComponentName) {
super(activity, mainComponentName);
currentActivity = activity;
}
protected ReactRootView createRootView() {
return new CustomReactRootView(currentActivity);
}
}
@Override
protected ReactActivityDelegate createReactActivityDelegate() {
return new CustomReactActivityDelegate(this, getMainComponentName());
}
...
}
как вы можете видеть, идея состоит в том, чтобы переопределить материал, чтобы зацепиться за нужный момент.
вы могли видеть другие вещи для подключения в этих классах, но в целом реагируют нагрузки связки асинхронно с функциями jni, поэтому я не уверен, что там много делать. Вы можете переопределить цепочку
-
MainApplication
(назначитьmReactNativeHost
) -> -
ReactNativeHost.createReactInstanceManager
(скопируйте исходный метод, но звонитеReactInstanceManagerBuilder.setJSBundleLoader
) -> -
JSBundleLoader
(wrap originalJSBundleLoader.createAssetLoader
в пользовательский подкласс, который будет вызывать внутренний загрузчик вloadScript
а затем также вызовCatalystInstanceImpl.callFunction
) -> -
CatalystInstanceImpl.PendingJSCall
просто запустить то, что вам нужно, чтобы работать там.
другими словами, это ужасно и до сих пор реагировать не гарантирует, что PendingJSCall
не будет запускаться до загрузки пакета.
использовать rn-splash-scren. Когда ваш компонент react загружается, просто вызовите
импорт SplashScreen из "RN-splash-screen";
// скрыть активный заставку
SplashScreen.hide();
вам нужно настроить его с родной стороны, но это легко.