react-native-navigation的迁移库

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import React, {Component} from 'react';
  2. import {
  3. NativeAppEventEmitter,
  4. DeviceEventEmitter,
  5. Platform
  6. } from 'react-native';
  7. import platformSpecific from './platformSpecific';
  8. import Navigation from './Navigation';
  9. const _allNavigatorEventHandlers = {};
  10. class Navigator {
  11. constructor(navigatorID, navigatorEventID) {
  12. this.navigatorID = navigatorID;
  13. this.navigatorEventID = navigatorEventID;
  14. this.navigatorEventHandler = null;
  15. this.navigatorEventSubscription = null;
  16. }
  17. push(params = {}) {
  18. return platformSpecific.navigatorPush(this, params);
  19. }
  20. pop(params = {}) {
  21. return platformSpecific.navigatorPop(this, params);
  22. }
  23. popToRoot(params = {}) {
  24. return platformSpecific.navigatorPopToRoot(this, params);
  25. }
  26. resetTo(params = {}) {
  27. return platformSpecific.navigatorResetTo(this, params);
  28. }
  29. showModal(params = {}) {
  30. return Navigation.showModal(params);
  31. }
  32. dismissModal(params = {}) {
  33. return Navigation.dismissModal(params);
  34. }
  35. dismissAllModals(params = {}) {
  36. return Navigation.dismissAllModals(params);
  37. }
  38. showLightBox(params = {}) {
  39. return Navigation.showLightBox(params);
  40. }
  41. dismissLightBox(params = {}) {
  42. return Navigation.dismissLightBox(params);
  43. }
  44. setButtons(params = {}) {
  45. return platformSpecific.navigatorSetButtons(this, this.navigatorEventID, params);
  46. }
  47. setTitle(params = {}) {
  48. return platformSpecific.navigatorSetTitle(this, params);
  49. }
  50. setTitleImage(params = {}) {
  51. return platformSpecific.navigatorSetTitleImage(this, params);
  52. }
  53. toggleDrawer(params = {}) {
  54. return platformSpecific.navigatorToggleDrawer(this, params);
  55. }
  56. toggleTabs(params = {}) {
  57. return platformSpecific.navigatorToggleTabs(this, params);
  58. }
  59. toggleNavBar(params = {}) {
  60. return platformSpecific.navigatorToggleNavBar(this, params);
  61. }
  62. setTabBadge(params = {}) {
  63. return platformSpecific.navigatorSetTabBadge(this, params);
  64. }
  65. switchToTab(params = {}) {
  66. return platformSpecific.navigatorSwitchToTab(this, params);
  67. }
  68. setOnNavigatorEvent(callback) {
  69. this.navigatorEventHandler = callback;
  70. if (!this.navigatorEventSubscription) {
  71. let Emitter = Platform.OS === 'android' ? DeviceEventEmitter : NativeAppEventEmitter;
  72. this.navigatorEventSubscription = Emitter.addListener(this.navigatorEventID, (event) => this.onNavigatorEvent(event));
  73. _allNavigatorEventHandlers[this.navigatorEventID] = (event) => this.onNavigatorEvent(event);
  74. }
  75. }
  76. handleDeepLink(params = {}) {
  77. if (!params.link) return;
  78. const event = {
  79. type: 'DeepLink',
  80. link: params.link
  81. };
  82. for (let i in _allNavigatorEventHandlers) {
  83. _allNavigatorEventHandlers[i](event);
  84. }
  85. }
  86. onNavigatorEvent(event) {
  87. if (this.navigatorEventHandler) {
  88. this.navigatorEventHandler(event);
  89. }
  90. }
  91. cleanup() {
  92. if (this.navigatorEventSubscription) {
  93. this.navigatorEventSubscription.remove();
  94. delete _allNavigatorEventHandlers[this.navigatorEventID];
  95. }
  96. }
  97. }
  98. export default class Screen extends Component {
  99. static navigatorStyle = {};
  100. static navigatorButtons = {};
  101. constructor(props) {
  102. super(props);
  103. if (props.navigatorID) {
  104. this.navigator = new Navigator(props.navigatorID, props.navigatorEventID);
  105. }
  106. }
  107. componentWillUnmount() {
  108. if (this.navigator) {
  109. this.navigator.cleanup();
  110. this.navigator = undefined;
  111. }
  112. }
  113. }