react-native-navigation的迁移库

Navigation.js 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import React from 'react';
  2. import {AppRegistry} from 'react-native';
  3. import platformSpecific from './platformSpecific';
  4. import Screen from './Screen';
  5. const registeredScreens = {};
  6. function registerScreen(screenID, generator) {
  7. registeredScreens[screenID] = generator;
  8. AppRegistry.registerComponent(screenID, generator);
  9. }
  10. function registerComponent(screenID, generator, store = undefined, Provider = undefined) {
  11. if (store && Provider) {
  12. return _registerComponentRedux(screenID, generator, store, Provider);
  13. } else {
  14. return _registerComponentNoRedux(screenID, generator);
  15. }
  16. }
  17. function _registerComponentNoRedux(screenID, generator) {
  18. const generatorWrapper = function() {
  19. const InternalComponent = generator();
  20. return class extends Screen {
  21. static navigatorStyle = InternalComponent.navigatorStyle || {};
  22. static navigatorButtons = InternalComponent.navigatorButtons || {};
  23. render() {
  24. return (
  25. <InternalComponent navigator={this.navigator} {...this.props} />
  26. );
  27. }
  28. };
  29. };
  30. registerScreen(screenID, generatorWrapper);
  31. return generatorWrapper;
  32. }
  33. function _registerComponentRedux(screenID, generator, store, Provider) {
  34. const generatorWrapper = function() {
  35. const InternalComponent = generator();
  36. return class extends Screen {
  37. static navigatorStyle = InternalComponent.navigatorStyle || {};
  38. static navigatorButtons = InternalComponent.navigatorButtons || {};
  39. render() {
  40. return (
  41. <Provider store={store}>
  42. <InternalComponent navigator={this.navigator} {...this.props} />
  43. </Provider>
  44. );
  45. }
  46. };
  47. };
  48. registerScreen(screenID, generatorWrapper);
  49. return generatorWrapper;
  50. }
  51. function getRegisteredScreen(screenID) {
  52. const generator = registeredScreens[screenID];
  53. if (!generator) {
  54. console.error(`Navigation.getRegisteredScreen: ${screenID} used but not yet registered`);
  55. return;
  56. }
  57. return generator();
  58. }
  59. function showModal(params = {}) {
  60. return platformSpecific.showModal(params);
  61. }
  62. function dismissModal(params = {}) {
  63. return platformSpecific.dismissModal(params);
  64. }
  65. function dismissAllModals(params = {}) {
  66. return platformSpecific.dismissAllModals(params);
  67. }
  68. function showLightBox(params = {}) {
  69. return platformSpecific.showLightBox(params);
  70. }
  71. function dismissLightBox(params = {}) {
  72. return platformSpecific.dismissLightBox(params);
  73. }
  74. function showInAppNotification(params = {}) {
  75. return platformSpecific.showInAppNotification(params);
  76. }
  77. function dismissInAppNotification(params = {}) {
  78. return platformSpecific.dismissInAppNotification(params);
  79. }
  80. module.exports = {
  81. registerScreen,
  82. getRegisteredScreen,
  83. registerComponent,
  84. showModal,
  85. dismissModal,
  86. dismissAllModals,
  87. showLightBox,
  88. dismissLightBox,
  89. showInAppNotification,
  90. dismissInAppNotification,
  91. startTabBasedApp: platformSpecific.startTabBasedApp,
  92. startSingleScreenApp: platformSpecific.startSingleScreenApp
  93. };