React-native innerhalb eines Fragments

8

Wie starte ich in einem Fragment reaktions-nativ? Wenn die onCreateView-Funktion reactive-native in Fragment platziert, kann sie View from mReactRootView nicht zurückgeben.

View view = inflater.inflate(mReactRootView. , container, false);

    
Ramesh Vishnoi 05.02.2016, 10:12
quelle

2 Antworten

19

Ich habe es mit viel Versuch und Irrtum herausgefunden. Ich habe diese Frage im Internet gesehen und dachte, dass dies der beste Ort ist, um die Antwort zu posten. Hier ist, wie mit der neuesten Version von React (0.29 zum Zeitpunkt des Schreibens):

Als Erstes erstellen wir eine abstrakte Klasse ReactFragment , die wir in unserer App verwenden werden:

%Vor%

Wir werden nun in der Lage sein, Fragmente zu erstellen, die Native Komponenten repetieren, z. B .:

%Vor%

Ein wenig mehr Arbeit ist jedoch erforderlich. Unser Elternteil Activity muss einige Dinge in ReactInstanceManager übergeben, damit der Lebenszyklus von React Native ordnungsgemäß funktioniert. Hier ist, womit ich endete:

%Vor%

Schließlich werden Sie im gesamten Code den Verweis auf (MyApplication) bemerken. Dies ist ein globales Application -Objekt, das unsere ReactInstanceManager , AKA die Brücke zwischen Android und React Native enthält. Dies ist das Muster, das die Native-React-Projekte intern verwenden, also habe ich es einfach kopiert. So wird es implementiert:

%Vor%

Das Schwierigste war, den Lebenszyklus zwischen dem Fragment und der Aktivität herauszufinden; Der ReactRootView benötigt einen Verweis auf den Aktivitätskontext, um ihn zu instanziieren. Daher war es wichtig, dass getActivity() nicht NULL ist. Auch das Registrieren der onHostPause() und onHostResume() in der übergeordneten Aktivität war zunächst nicht intuitiv, erwies sich aber letztendlich als einfacher, sobald die ReactNativeInstanceManager in eine globale abstrahiert wurde, anstatt sie auf der Aktivität oder dem Fragment zu belassen.

Hoffe, das hilft jemand anderem da draußen!

    
Lokeh 06.07.2016, 20:47
quelle
1

Es gibt Bibliotheken, die das für Sie erledigen.

Eine, die ich verwende, ist react-native-android-fragment

Gemäß den Anweisungen im verknüpften GitHub-Repository:

  1. Fügen Sie Ihrer build.gradle compile 'com.github.hudl:react-native-android-fragment:v0.43.2' .
  2. die folgende Zeile hinzu

z.B.

%Vor%
  1. Erzeuge deinen Code in das Fragment

    Fragment reactFragment = new ReactFragment.Builder() .setComponentName("HelloWorld") .setLaunchOptions(launchOptions) // A Bundle of launch options .build();

  2. Platzieren Sie das Fragment in einem FrameLayout, das Sie in Ihrer XML-Layoutdatei hätten. In meinem Fall ist die FrameLayout ID react_holder.

    getSupportFragmentManager() .beginTransaction() .add(R.id.react_holder, reactFragment) .commit();

AliAvci 25.07.2017 16:51
quelle