react-native-navigation的迁移库

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