Parcourir la source

Fixed bug where mergeOptions would incorrectly call applyOptions

* Use resolved options when applying options in ChildController
* mergeOptions only if view is visible
Guy Carmeli il y a 6 ans
Parent
révision
a5d01ba45a

+ 3
- 3
lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java Voir le fichier

23
 import com.reactnativenavigation.utils.TypefaceLoader;
23
 import com.reactnativenavigation.utils.TypefaceLoader;
24
 import com.reactnativenavigation.utils.UiThread;
24
 import com.reactnativenavigation.utils.UiThread;
25
 import com.reactnativenavigation.utils.UiUtils;
25
 import com.reactnativenavigation.utils.UiUtils;
26
-import com.reactnativenavigation.viewcontrollers.navigator.Navigator;
27
 import com.reactnativenavigation.viewcontrollers.ViewController;
26
 import com.reactnativenavigation.viewcontrollers.ViewController;
28
 import com.reactnativenavigation.viewcontrollers.externalcomponent.ExternalComponentCreator;
27
 import com.reactnativenavigation.viewcontrollers.externalcomponent.ExternalComponentCreator;
28
+import com.reactnativenavigation.viewcontrollers.navigator.Navigator;
29
 
29
 
30
 import java.util.Map;
30
 import java.util.Map;
31
 
31
 
61
 
61
 
62
 	@ReactMethod
62
 	@ReactMethod
63
 	public void setRoot(String commandId, ReadableMap rawLayoutTree, Promise promise) {
63
 	public void setRoot(String commandId, ReadableMap rawLayoutTree, Promise promise) {
64
-		final LayoutNode layoutTree = LayoutNodeParser.parse(JSONParser.parse(rawLayoutTree).optJSONObject("root"));
64
+        final LayoutNode layoutTree = LayoutNodeParser.parse(JSONParser.parse(rawLayoutTree).optJSONObject("root"));
65
 		handle(() -> {
65
 		handle(() -> {
66
             navigator().setEventEmitter(eventEmitter);
66
             navigator().setEventEmitter(eventEmitter);
67
             final ViewController viewController = newLayoutFactory().create(layoutTree);
67
             final ViewController viewController = newLayoutFactory().create(layoutTree);
81
 
81
 
82
 	@ReactMethod
82
 	@ReactMethod
83
 	public void push(String commandId, String onComponentId, ReadableMap rawLayoutTree, Promise promise) {
83
 	public void push(String commandId, String onComponentId, ReadableMap rawLayoutTree, Promise promise) {
84
-		final LayoutNode layoutTree = LayoutNodeParser.parse(JSONParser.parse(rawLayoutTree));
84
+        final LayoutNode layoutTree = LayoutNodeParser.parse(JSONParser.parse(rawLayoutTree));
85
 		handle(() -> {
85
 		handle(() -> {
86
             final ViewController viewController = newLayoutFactory().create(layoutTree);
86
             final ViewController viewController = newLayoutFactory().create(layoutTree);
87
             navigator().push(onComponentId, viewController, new NativeCommandListener(commandId, promise, eventEmitter, now));
87
             navigator().push(onComponentId, viewController, new NativeCommandListener(commandId, promise, eventEmitter, now));

+ 4
- 3
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/ChildController.java Voir le fichier

48
     @Override
48
     @Override
49
     public void applyOptions(Options options) {
49
     public void applyOptions(Options options) {
50
         super.applyOptions(options);
50
         super.applyOptions(options);
51
-        presenter.applyOptions(getView(), options);
51
+        Options resolvedOptions = resolveCurrentOptions();
52
+        presenter.applyOptions(getView(), resolvedOptions);
52
         if (isRoot()) {
53
         if (isRoot()) {
53
-            presenter.applyRootOptions(getView(), options);
54
+            presenter.applyRootOptions(getView(), resolvedOptions);
54
         }
55
         }
55
     }
56
     }
56
 
57
 
57
     @Override
58
     @Override
58
     public void mergeOptions(Options options) {
59
     public void mergeOptions(Options options) {
59
         if (options == Options.EMPTY) return;
60
         if (options == Options.EMPTY) return;
60
-        presenter.mergeOptions(getView(), options);
61
+        if (isViewShown()) presenter.mergeOptions(getView(), options);
61
         super.mergeOptions(options);
62
         super.mergeOptions(options);
62
     }
63
     }
63
 
64
 

+ 0
- 1
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/ViewController.java Voir le fichier

108
     public void mergeOptions(Options options) {
108
     public void mergeOptions(Options options) {
109
         this.initialOptions = this.initialOptions.mergeWith(options);
109
         this.initialOptions = this.initialOptions.mergeWith(options);
110
         this.options = this.options.mergeWith(options);
110
         this.options = this.options.mergeWith(options);
111
-        if (view != null) applyOptions(this.options);
112
         this.options.clearOneTimeOptions();
111
         this.options.clearOneTimeOptions();
113
         initialOptions.clearOneTimeOptions();
112
         initialOptions.clearOneTimeOptions();
114
     }
113
     }

+ 12
- 5
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/child/ChildControllerTest.java Voir le fichier

21
     private ChildController uut;
21
     private ChildController uut;
22
     private ChildControllersRegistry childRegistry;
22
     private ChildControllersRegistry childRegistry;
23
     private OptionsPresenter presenter;
23
     private OptionsPresenter presenter;
24
+    private Options resolvedOptions = new Options();
24
 
25
 
25
     @Override
26
     @Override
26
     public void beforeEach() {
27
     public void beforeEach() {
27
         childRegistry = spy(new ChildControllersRegistry());
28
         childRegistry = spy(new ChildControllersRegistry());
28
         presenter = Mockito.mock(OptionsPresenter.class);
29
         presenter = Mockito.mock(OptionsPresenter.class);
29
-        uut = new SimpleViewController(newActivity(), childRegistry, "childId", presenter, new Options());
30
+        uut = new SimpleViewController(newActivity(), childRegistry, "childId", presenter, new Options()) {
31
+            @Override
32
+            public Options resolveCurrentOptions() {
33
+                return resolvedOptions;
34
+            }
35
+        };
30
     }
36
     }
31
 
37
 
32
     @Test
38
     @Test
45
 
51
 
46
     @Test
52
     @Test
47
     public void applyOptions_applyRootOptionsIfRoot() {
53
     public void applyOptions_applyRootOptionsIfRoot() {
48
-        addToParent(newActivity(), uut);
49
-        Options options = new Options();
50
-        uut.applyOptions(options);
51
-        verify(presenter, times(1)).applyRootOptions(uut.getView(), options);
54
+        newActivity().setContentView(uut.getView());
55
+        verify(presenter).applyOptions(uut.getView(), resolvedOptions);
56
+        verify(presenter).applyRootOptions(uut.getView(), resolvedOptions);
52
     }
57
     }
53
 
58
 
54
     @Test
59
     @Test
61
 
66
 
62
     @Test
67
     @Test
63
     public void mergeOptions() {
68
     public void mergeOptions() {
69
+        newActivity().setContentView(uut.getView());
70
+
64
         Options options = new Options();
71
         Options options = new Options();
65
         uut.mergeOptions(options);
72
         uut.mergeOptions(options);
66
         verify(presenter).mergeOptions(uut.getView(), options);
73
         verify(presenter).mergeOptions(uut.getView(), options);