Skip to content

Commit e649a6c

Browse files
authored
fix(tabs): delay loadView when animation runs (NativeScript#8353)
* fix(tabs): delay loadView when animation runs * chore: update api.md * chore: remove unnecessary casting * test: Added disabled test for changing tabs
1 parent dd11158 commit e649a6c

File tree

14 files changed

+104
-10
lines changed

14 files changed

+104
-10
lines changed

api-reports/NativeScript.api.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,9 @@ export class Frame extends View {
772772

773773
animated: boolean;
774774

775+
// (undocumented)
776+
_animationInProgress: boolean;
777+
775778
backStack: Array<BackstackEntry>;
776779

777780
canGoBack(): boolean;
@@ -2931,6 +2934,7 @@ export abstract class ViewBase extends Observable {
29312934
// (undocumented)
29322935
_setupAsRootView(context: any): void;
29332936
_setupUI(context: any /* android.content.Context */, atIndex?: number): void;
2937+
_shouldDelayLoad(): boolean;
29342938
showModal(moduleName: string, modalOptions: ShowModalOptions): ViewBase;
29352939
showModal(view: ViewBase, modalOptions: ShowModalOptions): ViewBase;
29362940
public readonly style: Style;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<Page class="page" >
2+
<Label text="Inner label 1" backgroundColor="blue"/>
3+
</Page>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<Page class="page">
2+
<Label text="Inner label 2" backgroundColor="red"/>
3+
</Page>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<Page class="page">
2+
<Label text="Inner label 3" backgroundColor="orange"/>
3+
</Page>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<Page class="page">
2+
<Label text="Inner label 4" backgroundColor="green"/>
3+
</Page>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export function onItemTap(args) {
2+
console.log(`Item with index: ${args.index} tapped`);
3+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<Page class="page">
2+
<StackLayout>
3+
<Tabs highlightColor="red" offscreenTabLimit="1">
4+
<TabStrip highlightColor="green" itemTap="onItemTap">
5+
<TabStripItem title="1"></TabStripItem>
6+
<TabStripItem title="2"></TabStripItem>
7+
<TabStripItem title="3"></TabStripItem>
8+
<TabStripItem title="4"></TabStripItem>
9+
</TabStrip>
10+
<TabContentItem>
11+
<Frame defaultPage="tabs/frame-in-tabs-inner-page-1"></Frame>
12+
</TabContentItem>
13+
<TabContentItem>
14+
<Frame defaultPage="tabs/frame-in-tabs-inner-page-2"></Frame>
15+
</TabContentItem>
16+
<TabContentItem>
17+
<Frame defaultPage="tabs/frame-in-tabs-inner-page-3"></Frame>
18+
</TabContentItem>
19+
<TabContentItem>
20+
<Frame defaultPage="tabs/frame-in-tabs-inner-page-4"></Frame>
21+
</TabContentItem>
22+
</Tabs>
23+
</StackLayout>
24+
</Page>

e2e/ui-tests-app/e2e/suites/tab-navigation/tabs/tabs-tests.e2e-spec.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,4 +283,22 @@ describe(`${imagePrefix}-suite`, async function () {
283283
assert.isTrue(driver.imageHelper.hasImageComparisonPassed());
284284
await tabsViewBasePage.navigateBackToSuitMainPage();
285285
});
286+
287+
// it(`${imagePrefix}-frame-in-tabs`, async function () {
288+
// await tabsViewBasePage.navigateToSample("frame-in-tabs");
289+
// await driver.imageHelper.compareScreen();
290+
291+
// // go through the tabs and check that they are loaded
292+
// await tabsViewBasePage.tabOnItem(1);
293+
// await driver.imageHelper.compareScreen();
294+
295+
// await tabsViewBasePage.tabOnItem(2);
296+
// await driver.imageHelper.compareScreen();
297+
298+
// await tabsViewBasePage.tabOnItem(3);
299+
// await driver.imageHelper.compareScreen();
300+
301+
// assert.isTrue(driver.imageHelper.hasImageComparisonPassed());
302+
// await tabsViewBasePage.navigateBackToSuitMainPage();
303+
// });
286304
});

nativescript-core/ui/core/view-base/view-base.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,12 @@ export abstract class ViewBase extends Observable {
470470
*/
471471
_setupAsRootView(context: any): void;
472472

473+
/**
474+
* When returning true the callLoaded method will be run in setTimeout
475+
* Method is intended to be overridden by inheritors and used as "protected"
476+
*/
477+
_shouldDelayLoad(): boolean;
478+
473479
/**
474480
* @private
475481
*/

nativescript-core/ui/core/view-base/view-base.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -615,10 +615,18 @@ export abstract class ViewBase extends Observable implements ViewBaseDefinition
615615

616616
public loadView(view: ViewBase): void {
617617
if (view && !view.isLoaded) {
618-
view.callLoaded();
618+
if (this._shouldDelayLoad()) {
619+
setTimeout(() => view.callLoaded());
620+
} else {
621+
view.callLoaded();
622+
}
619623
}
620624
}
621625

626+
public _shouldDelayLoad(): boolean {
627+
return false;
628+
}
629+
622630
public unloadView(view: ViewBase): void {
623631
if (view && view.isLoaded) {
624632
view.callUnloaded();
@@ -1053,7 +1061,7 @@ export const classNameProperty = new Property<ViewBase, string>({
10531061
cssClasses.clear();
10541062

10551063
if (shouldAddModalRootViewCssClasses) {
1056-
cssClasses.add(MODAL_ROOT_VIEW_CSS_CLASS);
1064+
cssClasses.add(MODAL_ROOT_VIEW_CSS_CLASS);
10571065
} else if (shouldAddRootViewCssClasses) {
10581066
cssClasses.add(ROOT_VIEW_CSS_CLASS);
10591067
}

0 commit comments

Comments
 (0)