2015-12-02 62 views
10

Sto lavorando in React-Native e sto cercando di passare gli oggetti di scena iniziali a JS via Java. Questo può essere fatto facilmente in Objective-C con initialProperties come questo:React Native - initialProperties Android

RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 
                 moduleName:@"myapp" 
               initialProperties:initialProperties 
                launchOptions:launchOptions]; 

Dove initialProperties è un NSDictionary che sarà convertita in JSON e disponibile in JS via this.props. Quindi sto cercando di fare lo stesso in Android. Qualsiasi aiuto ? Grazie

risposta

14

In Android, è possibile passare initialProperties con il launchOptions come pacchetto.

Come menzionato qui nel codice sorgente: https://github.com/facebook/react-native/blob/7377fdcc70b25eb023e7c6d1b37eeae2a700cb88/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java#L325-L334

modo da poter fare qualcosa di simile:

Bundle initialProps = new Bundle(); 
initialProps.putString("myKey", "myValue"); 

mReactRootView.startReactApplication(mReactInstanceManager, "MyAwesomeApp", initialProps); 
+0

Questo funziona meravigliosamente. Perché le altre risposte parlano di 'ReactActivityDelegate'? –

+0

È possibile passare dati strutturati, in modo simile al modo in cui è possibile passare in un NSDictionary di valori a React Native in iOS? O i valori scalari sono possibili solo? –

3

A partire dal v0.20 reagire nativo, è possibile ignorare il metodo getLaunchOptions nel MainActivity.java file.

@Override 
protected Bundle getLaunchOptions() { 
    Bundle opts = new Bundle(); 
    opts.putBoolean("someValue", true); 
    return opts; 
} 

Questo vi permetterà di accedere someValue da puntelli del componente applicazione principale:

class App extends React.Component { 
    static propTypes = { 
    someValue: PropTypes.bool, 
    }; 

    render() { 
    return <SomeComponent someValue={this.props.someValue} />; 
    } 
} 

AppRegistry.registerComponent('App',() => App); 
3

Attenzione, questo è deprecato in reagire nativo> 0,34

https://github.com/facebook/react-native/pull/9320

questo è il messaggio di commit:

Move `getLaunchOptions` from ReactActivity to ReactActivityDelegate 
Summary: 
After 3c4fd42, `getLaunchOptions` no longer exists in class `ReactActivity`. 
We need refactor UIExplorerActivity to fix the build error. 
Closes #9320 

Differential Revision: D3696381 

Pulled By: astreet 

fbshipit-source-id: 5700cf2363029a95cfbdaf6230e4f82ea69fb472 
master (#2) v0.34.0-rc.0 

Quindi è necessario modificare questa parte del codice se si aggiorna la versione di reagire e, poiché si sta eseguendo l'override di un metodo che non esiste nella classe padre, è possibile che non venga visualizzato alcun messaggio di errore 'll essere difficile da eseguire il debug

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/13661616) – Pongpat

+1

a destra, ho modificato la mia risposta per mostrare il messaggio di commit – Thibaut

8

getlauchOptions è stato spostato all'interno ReactActivityDelegate, ora uso di questo codice:

public class MainActivity extends ReactActivity { 

/** 
* Returns the name of the main component registered from JavaScript. 
* This is used to schedule rendering of the component. 
*/ 
@Override 
protected String getMainComponentName() { 
    return "myAppName"; 
} 

@Override 
protected ReactActivityDelegate createReactActivityDelegate() { 
    return new ReactActivityDelegate(this, getMainComponentName()) { 
     @Nullable 
     @Override 
     protected Bundle getLaunchOptions() { 
      Bundle initialProps = new Bundle(); 
      initialProps.putString("SOME_VARIABLE_1", BuildConfig.SOME_VARIABLE_1); 
      initialProps.putString("SOME_VARIABLE_2", "some variable 2 value"); 
      return initialProps; 
     } 
    }; 
} 
+0

Eccellente! Dovresti aggiungere che devi aggiungere in alto 'import com.facebook.react.ReactActivityDelegate;' e per impostazione predefinita '@ Nullable' non è disponibile in RN. L'ho appena lasciato cadere, supponendo che significhi che ho solo bisogno di passare sempre un valore. – ssomnoremac

+0

potresti aggiungere commenti @ssomnoremac nella tua risposta? Sono facilmente invisibili – Thibaut

3

Tutte le risposte qui sembrava un po' fuori moda. Con React-Native 0.42 questo ha funzionato per me.

nella vostra attività (non Application) di classe fare questo

@Override 
protected ReactActivityDelegate createReactActivityDelegate() { 
    return new ReactActivityDelegate(this, "My Cool App") { 
     @Nullable 
     @Override 
     protected Bundle getLaunchOptions() { 
      Bundle bundle = new Bundle(); 
      if(MainActivity.this.port != null) { 
       bundle.putInt("port", MainActivity.this.port); 
      } 
      return bundle; 
     } 
    }; 
} 

Ovviamente sostituire "porta" con tutto ciò che si desidera passare ai puntelli del vostro principale Reagire componente nativo