diff --git a/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp.Android/FreshMvvmApp.Android.csproj b/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp.Android/FreshMvvmApp.Android.csproj index d59db1e..421bde3 100644 --- a/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp.Android/FreshMvvmApp.Android.csproj +++ b/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp.Android/FreshMvvmApp.Android.csproj @@ -54,7 +54,7 @@ - 4.6.0.772 + 4.6.0.1180 diff --git a/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp.Android/Resources/Resource.designer.cs b/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp.Android/Resources/Resource.designer.cs index 36b9cba..a2c1b31 100644 --- a/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp.Android/Resources/Resource.designer.cs +++ b/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp.Android/Resources/Resource.designer.cs @@ -2,7 +2,6 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp.iOS/FreshMvvmApp.iOS.csproj b/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp.iOS/FreshMvvmApp.iOS.csproj index 05df670..68a13fb 100644 --- a/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp.iOS/FreshMvvmApp.iOS.csproj +++ b/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp.iOS/FreshMvvmApp.iOS.csproj @@ -145,7 +145,7 @@ - + diff --git a/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/App.xaml.cs b/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/App.xaml.cs index 66f6ef3..6ef3f41 100644 --- a/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/App.xaml.cs +++ b/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/App.xaml.cs @@ -1,6 +1,7 @@ using System; using Xamarin.Forms; using System.Collections.Generic; +using System.Threading.Tasks; using FreshMvvm; namespace FreshMvvmApp @@ -14,9 +15,9 @@ public App() MainPage = new NavigationPage(new LaunchPage(this)); } - public void LoadBasicNav() + public async Task LoadBasicNav() { - var page = FreshPageModelResolver.ResolvePageModel(); + var page = await FreshPageModelResolver.ResolvePageModel(); var basicNavContainer = new FreshNavigationContainer(page); MainPage = basicNavContainer; } @@ -46,17 +47,17 @@ public void LoadFOTabbedNav() MainPage = tabbedNavigation; } - public void LoadCustomNav() + public async Task LoadCustomNav() { - MainPage = new CustomImplementedNav(); + MainPage = await CustomImplementedNav.Create(); } - public void LoadMultipleNavigation() + public async Task LoadMultipleNavigation() { var masterDetailsMultiple = new MasterDetailPage(); //generic master detail page //we setup the first navigation container with ContactList - var contactListPage = FreshPageModelResolver.ResolvePageModel(); + var contactListPage = await FreshPageModelResolver.ResolvePageModel(); contactListPage.Title = "Contact List"; //we setup the first navigation container with name MasterPageArea var masterPageArea = new FreshNavigationContainer(contactListPage, "MasterPageArea"); @@ -65,7 +66,7 @@ public void LoadMultipleNavigation() masterDetailsMultiple.Master = masterPageArea; //set the first navigation container to the Master //we setup the second navigation container with the QuoteList - var quoteListPage = FreshPageModelResolver.ResolvePageModel(); + var quoteListPage = await FreshPageModelResolver.ResolvePageModel(); quoteListPage.Title = "Quote List"; //we setup the second navigation container with name DetailPageArea var detailPageArea = new FreshNavigationContainer(quoteListPage, "DetailPageArea"); diff --git a/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp.csproj b/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp.csproj index 7d880e7..301b41c 100644 --- a/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp.csproj +++ b/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp.csproj @@ -12,7 +12,7 @@ runtime; build; native; contentfiles; analyzers - + diff --git a/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/LaunchPage.cs b/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/LaunchPage.cs index 9f5f0b9..8edaf9a 100644 --- a/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/LaunchPage.cs +++ b/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/LaunchPage.cs @@ -18,9 +18,9 @@ public LaunchPage (App app) "Tabbed (FO) Navigation", "Multiple Navigation" }; - list.ItemTapped += (object sender, ItemTappedEventArgs e) => { + list.ItemTapped += async (object sender, ItemTappedEventArgs e) => { if ((string)e.Item == "Basic Navigation") - app.LoadBasicNav (); + await app.LoadBasicNav (); else if ((string)e.Item == "Master Detail") app.LoadMasterDetail (); else if ((string)e.Item == "Tabbed Navigation") @@ -28,9 +28,9 @@ public LaunchPage (App app) else if ((string)e.Item == "Tabbed (FO) Navigation") app.LoadFOTabbedNav (); else if ((string)e.Item == "Custom Navigation") - app.LoadCustomNav (); + await app.LoadCustomNav (); else if ((string)e.Item == "Multiple Navigation") - app.LoadMultipleNavigation (); + await app.LoadMultipleNavigation (); }; this.Content = list; } diff --git a/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/Navigation/CustomImplementedNav.cs b/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/Navigation/CustomImplementedNav.cs index 7a8d7c5..8f92cd3 100644 --- a/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/Navigation/CustomImplementedNav.cs +++ b/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/Navigation/CustomImplementedNav.cs @@ -2,6 +2,7 @@ using FreshMvvm; using Xamarin.Forms; using System.Collections.Generic; +using System.Dynamic; using System.Threading.Tasks; namespace FreshMvvmApp @@ -14,19 +15,31 @@ public class CustomImplementedNav : Xamarin.Forms.MasterDetailPage, IFreshNaviga FreshTabbedNavigationContainer _tabbedNavigationPage; Page _contactsPage, _quotesPage; - public CustomImplementedNav () + private CustomImplementedNav () { NavigationServiceName = "CustomImplementedNav"; - SetupTabbedPage (); + } + + public static async Task Create() + { + var newInstance = new CustomImplementedNav(); + return await newInstance.InitialiseAsync(); + } + + private async Task InitialiseAsync() + { + NavigationServiceName = "CustomImplementedNav"; + await SetupTabbedPage (); CreateMenuPage ("Menu"); RegisterNavigation (); + return this; } - void SetupTabbedPage() + async Task SetupTabbedPage() { _tabbedNavigationPage = new FreshTabbedNavigationContainer (); - _contactsPage = _tabbedNavigationPage.AddTab ("Contacts", "contacts.png"); - _quotesPage = _tabbedNavigationPage.AddTab ("Quotes", "document.png"); + _contactsPage = await _tabbedNavigationPage.AddTab ("Contacts", "contacts.png"); + _quotesPage = await _tabbedNavigationPage.AddTab ("Quotes", "document.png"); this.Detail = _tabbedNavigationPage; } @@ -54,7 +67,7 @@ protected void CreateMenuPage(string menuPageTitle) _tabbedNavigationPage.CurrentPage = _quotesPage; break; case "Modal Demo": - var modalPage = FreshPageModelResolver.ResolvePageModel(); + var modalPage = await FreshPageModelResolver.ResolvePageModel(); await PushPage(modalPage, null, true); break; default: diff --git a/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/PageModels/ContactPageModel.cs b/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/PageModels/ContactPageModel.cs index 8ac8815..f18b0c0 100644 --- a/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/PageModels/ContactPageModel.cs +++ b/samples/FreshMvvmApp/FreshMvvmApp/FreshMvvmApp/PageModels/ContactPageModel.cs @@ -2,6 +2,7 @@ using PropertyChanged; using FreshMvvm; using System; +using System.Threading.Tasks; namespace FreshMvvmApp { @@ -24,13 +25,15 @@ void HandleContactChanged(string propertyName) public Contact Contact { get; set; } - public override void Init (object initData) + public override Task InitAsync(object initData) { if (initData != null) { Contact = (Contact)initData; } else { Contact = new Contact (); } + + return base.InitAsync(initData); } public Command SaveCommand { @@ -55,7 +58,7 @@ public Command TestModalNavigationBasic { get { return new Command (async () => { - var page = FreshPageModelResolver.ResolvePageModel (); + var page = await FreshPageModelResolver.ResolvePageModel (); var basicNavContainer = new FreshNavigationContainer (page, Guid.NewGuid ().ToString ()); await CoreMethods.PushNewNavigationServiceModal(basicNavContainer, new FreshBasePageModel[] { page.GetModel() }); }); diff --git a/src/FreshMvvm.Tests/Fixtures/FreshPageModelResolverFixture.cs b/src/FreshMvvm.Tests/Fixtures/FreshPageModelResolverFixture.cs index 4f5d8f7..a8ed978 100644 --- a/src/FreshMvvm.Tests/Fixtures/FreshPageModelResolverFixture.cs +++ b/src/FreshMvvm.Tests/Fixtures/FreshPageModelResolverFixture.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using FreshMvvm.Tests.Mocks; using NUnit.Framework; @@ -10,16 +11,16 @@ public class FreshPageModelResolverFixture [TestCase] public void Test_ResolvePageModel_Not_Found() { - Assert.Throws(() => + Assert.ThrowsAsync(async () => { - FreshPageModelResolver.ResolvePageModel(); + await FreshPageModelResolver.ResolvePageModel(); }); } [TestCase] - public void Test_ResolvePageModel() + public async Task Test_ResolvePageModel() { - var page = FreshPageModelResolver.ResolvePageModel(); + var page = await FreshPageModelResolver.ResolvePageModel(); var context = page.BindingContext as MockContentPageModel; Assert.IsNotNull(context); @@ -28,9 +29,9 @@ public void Test_ResolvePageModel() } [TestCase("test data")] - public void Test_ResolvePageModel_With_Init(object data) + public async Task Test_ResolvePageModel_With_Init(object data) { - var page = FreshPageModelResolver.ResolvePageModel(data); + var page = await FreshPageModelResolver.ResolvePageModel(data); var context = page.BindingContext as MockContentPageModel; Assert.IsNotNull(context); diff --git a/src/FreshMvvm.Tests/Fixtures/MultipleNavigationProviderTests.cs b/src/FreshMvvm.Tests/Fixtures/MultipleNavigationProviderTests.cs index 9708aee..ed8e0ce 100644 --- a/src/FreshMvvm.Tests/Fixtures/MultipleNavigationProviderTests.cs +++ b/src/FreshMvvm.Tests/Fixtures/MultipleNavigationProviderTests.cs @@ -3,6 +3,7 @@ using FreshMvvm.Tests.Mocks; using NUnit.Framework; using System.Linq; +using System.Threading.Tasks; using Xamarin.Forms; using NSubstitute; @@ -24,12 +25,12 @@ public MultipleNavigationProviderTests () /// This test ensures the first pagemodels are created with a link to the named navigation service /// [Test] - public void pagemodel_should_be_link_to_when_created_firsttime() + public async Task pagemodel_should_be_link_to_when_created_firsttime() { //master detail navigation var masterDetailNavigation = new FreshMasterDetailNavigationContainer("TestingLinking"); - masterDetailNavigation.AddPage ("Page1"); - masterDetailNavigation.AddPage ("Page2"); + await masterDetailNavigation.AddPage ("Page1"); + await masterDetailNavigation.AddPage ("Page2"); var pageModel1 = masterDetailNavigation.Pages ["Page1"].GetPageFromNav().GetModel (); var pageModel2 = masterDetailNavigation.Pages ["Page2"].GetPageFromNav().GetModel(); pageModel1.CurrentNavigationServiceName.Should ().Be ("TestingLinking"); @@ -40,8 +41,8 @@ public void pagemodel_should_be_link_to_when_created_firsttime() //tabbed navigation var tabbedNavigation = new FreshTabbedNavigationContainer("TestingLinking2"); - tabbedNavigation.AddTab ("Page1", null); - tabbedNavigation.AddTab ("Page2", null); + await tabbedNavigation.AddTab ("Page1", null); + await tabbedNavigation.AddTab ("Page2", null); var tabbedPageModel1 = tabbedNavigation.TabbedPages.First ().GetModel (); var tabbedPageModel2 = tabbedNavigation.TabbedPages.Skip (1).Take (1).First ().GetModel (); tabbedPageModel1.CurrentNavigationServiceName.Should ().Be ("TestingLinking2"); @@ -51,7 +52,7 @@ public void pagemodel_should_be_link_to_when_created_firsttime() throw new Exception ("Should contain navigation service"); //standard navigation should set named navigation - var page = FreshPageModelResolver.ResolvePageModel(); + var page =await FreshPageModelResolver.ResolvePageModel(); var pageModel = page.BindingContext as MockContentPageModel; new FreshNavigationContainer(page, "testingLinking3"); pageModel.CurrentNavigationServiceName.Should ().Be ("testingLinking3"); @@ -69,14 +70,14 @@ public void pagemodel_should_be_link_to_when_created_firsttime() /// Each time a new PageModel is pushed, the NavigationServiceName is passed on /// [Test] - public void navigation_servicename_is_passed_on() + public async Task navigation_servicename_is_passed_on() { - SetupFirstNavigationAndPage (); + await SetupFirstNavigationAndPage (); var coreMethods = new PageModelCoreMethods (_page, _pageModel); - coreMethods.PushPageModel (); + await coreMethods.PushPageModel (); - _navigationMock.Received ().PushPage (Arg.Any (), + await _navigationMock.Received ().PushPage (Arg.Any (), Arg.Is (o => o.CurrentNavigationServiceName == _pageModel.CurrentNavigationServiceName), false, true); } @@ -84,23 +85,23 @@ public void navigation_servicename_is_passed_on() /// The correct IFreshNavigationService should always be resolved name /// [Test] - public void navigationservice_should_be_resolved_via_name() + public async Task navigationservice_should_be_resolved_via_name() { - SetupFirstNavigationAndPage (); + await SetupFirstNavigationAndPage (); var coreMethods = new PageModelCoreMethods (_page, _pageModel); - coreMethods.PushPageModel (); - coreMethods.PushPageModel (); + await coreMethods.PushPageModel (); + await coreMethods.PushPageModel (); _navigationMock.ReceivedCalls (); _navigationMock.ClearReceivedCalls (); - coreMethods.PopPageModel (); + await coreMethods.PopPageModel (); _navigationMock.ReceivedCalls (); _navigationMock.ClearReceivedCalls (); - coreMethods.PopToRoot (false); + await coreMethods.PopToRoot (false); } /// People want the ability to modal with new NavigationService, this is the case where a ModalScreen also has @@ -108,23 +109,23 @@ public void navigationservice_should_be_resolved_via_name() /// - needs ability to push modally with a new navigation service [Test] - public void push_modally_new_navigation_service() + public async Task push_modally_new_navigation_service() { - SetupFirstNavigationAndPage (); + await SetupFirstNavigationAndPage (); - PushSecondNavigationStack (); + await PushSecondNavigationStack (); //navigationService has push modal with new navigation service - _navigationMock.Received ().PushPage (_secondNavService, Arg.Any(), true); + await _navigationMock.Received ().PushPage (_secondNavService, Arg.Any(), true); } /// - when a new navigation service is pushed then models stores the previous navigationname [Test] - public void new_navigationservice_the_model_stores_previous_navigationname() + public async Task new_navigationservice_the_model_stores_previous_navigationname() { - SetupFirstNavigationAndPage (); + await SetupFirstNavigationAndPage (); - PushSecondNavigationStack (); + await PushSecondNavigationStack (); _pageModelSecond.CurrentNavigationServiceName.Should ().Be ("secondNav"); _pageModelSecond.PreviousNavigationServiceName.Should ().Be ("firstNav"); @@ -133,13 +134,13 @@ public void new_navigationservice_the_model_stores_previous_navigationname() /// - when model are pushed then we need to keep a reference to previous navigationname [Test] - public void model_pushed_store_previous_navigationname() + public async Task model_pushed_store_previous_navigationname() { - SetupFirstNavigationAndPage (); + await SetupFirstNavigationAndPage (); - PushSecondNavigationStack (); + await PushSecondNavigationStack (); - _coreMethods.PushPageModel (); + await _coreMethods.PushPageModel (); var pageModelLatest = _secondNavService.CurrentPage.BindingContext as FreshBasePageModel; @@ -148,35 +149,35 @@ public void model_pushed_store_previous_navigationname() /// - when the first new page is pop'd we pop from older navigation service [Test] - public void firstmodelchild_poped_popfrom_previous_navigation() + public async Task firstmodelchild_poped_popfrom_previous_navigation() { - SetupFirstNavigationAndPage (); + await SetupFirstNavigationAndPage (); - PushSecondNavigationStack (); + await PushSecondNavigationStack (); - _coreMethodsSecondPage.PopPageModel (true); + await _coreMethodsSecondPage.PopPageModel (true); //previousNavigation has pop modal called - _navigationMock.Received().PopPage(true); + await _navigationMock.Received().PopPage(true); } /// - when is someone pushes a new MasterDetail or TabbedPages, how do we go back, we need like a PopModalNavigation [Test] - public void should_allow_popmodalnavigation() + public async Task should_allow_popmodalnavigation() { - SetupFirstNavigationAndPage (); + await SetupFirstNavigationAndPage (); - PushSecondNavigationStack (); + await PushSecondNavigationStack (); - _coreMethodsSecondPage.PushPageModel (); + await _coreMethodsSecondPage.PushPageModel (); var pageModelLatest = _secondNavService.CurrentPage.BindingContext as FreshBasePageModel; - pageModelLatest.CoreMethods.PopModalNavigationService (); + await pageModelLatest.CoreMethods.PopModalNavigationService (); //previousNavigation has pop modal called - _navigationMock.Received().PopPage(true); + await _navigationMock.Received().PopPage(true); } //TODO: test for this @@ -191,14 +192,14 @@ public void should_allow_popmodalnavigation() Page _page; FreshBasePageModel _pageModel; - void SetupFirstNavigationAndPage() + async Task SetupFirstNavigationAndPage() { _navigationMock = Substitute.For (); FreshIOC.Container.Register (_navigationMock, "firstNav"); - _page = FreshPageModelResolver.ResolvePageModel(); + _page = await FreshPageModelResolver.ResolvePageModel(); _pageModel = _page.BindingContext as MockContentPageModel; - _pageModel.CurrentNavigationServiceName = "firstNav"; + _pageModel.CurrentNavigationServiceName = "firstNav"; } PageModelCoreMethods _coreMethodsSecondPage; @@ -207,17 +208,17 @@ void SetupFirstNavigationAndPage() FreshBasePageModel _pageModelSecond; FreshNavigationContainer _secondNavService; - void PushSecondNavigationStack() + async Task PushSecondNavigationStack() { _coreMethods = new PageModelCoreMethods (_page, _pageModel); - _coreMethods.PushPageModel (); + await _coreMethods.PushPageModel (); - _pageSecond = FreshPageModelResolver.ResolvePageModel(); + _pageSecond = await FreshPageModelResolver.ResolvePageModel(); _pageModelSecond = _pageSecond.BindingContext as MockContentPageModel; _coreMethodsSecondPage = new PageModelCoreMethods (_pageSecond, _pageModelSecond); _secondNavService = new FreshNavigationContainer (_pageSecond, "secondNav"); - _coreMethods.PushNewNavigationServiceModal (_secondNavService, new FreshBasePageModel[] { _pageModelSecond }); + await _coreMethods.PushNewNavigationServiceModal (_secondNavService, new FreshBasePageModel[] { _pageModelSecond }); } } } diff --git a/src/FreshMvvm.Tests/Fixtures/PageModelCoreMethodsFixture.cs b/src/FreshMvvm.Tests/Fixtures/PageModelCoreMethodsFixture.cs index fba8b61..88e3890 100644 --- a/src/FreshMvvm.Tests/Fixtures/PageModelCoreMethodsFixture.cs +++ b/src/FreshMvvm.Tests/Fixtures/PageModelCoreMethodsFixture.cs @@ -14,12 +14,12 @@ class PageModelCoreMethodsFixture Page _page; FreshBasePageModel _pageModel; - void SetupFirstNavigationAndPage() + async Task SetupFirstNavigationAndPage() { _navigationMock = Substitute.For(); FreshIOC.Container.Register(_navigationMock, "firstNav"); - _page = FreshPageModelResolver.ResolvePageModel(); + _page = await FreshPageModelResolver.ResolvePageModel(); _pageModel = _page.BindingContext as MockContentPageModel; _pageModel.CurrentNavigationServiceName = "firstNav"; @@ -30,12 +30,12 @@ void SetupFirstNavigationAndPage() [Test] public async Task model_property_populated_by_action() { - SetupFirstNavigationAndPage(); + await SetupFirstNavigationAndPage(); const string item = "asj"; await _coreMethods.PushPageModel(pm => pm.Item = item); - _navigationMock.Received().PushPage(Arg.Any(), Arg.Is(o => o.Item == item), Arg.Any(), Arg.Any()); + await _navigationMock.Received().PushPage(Arg.Any(), Arg.Is(o => o.Item == item), Arg.Any(), Arg.Any()); } } } diff --git a/src/FreshMvvm.Tests/FreshMvvm.Tests.csproj b/src/FreshMvvm.Tests/FreshMvvm.Tests.csproj index 9ff6f0a..38ddaa9 100644 --- a/src/FreshMvvm.Tests/FreshMvvm.Tests.csproj +++ b/src/FreshMvvm.Tests/FreshMvvm.Tests.csproj @@ -1,7 +1,7 @@  + - Debug AnyCPU @@ -66,14 +66,17 @@ ..\packages\NSubstitute.3.1.0\lib\net45\NSubstitute.dll - - ..\packages\Xamarin.Forms.3.4.0.1009999\lib\netstandard2.0\Xamarin.Forms.Core.dll + + ..\packages\Xamarin.Forms.4.6.0.800\lib\netstandard2.0\Xamarin.Forms.Core.dll + True - - ..\packages\Xamarin.Forms.3.4.0.1009999\lib\netstandard2.0\Xamarin.Forms.Platform.dll + + ..\packages\Xamarin.Forms.4.6.0.800\lib\netstandard2.0\Xamarin.Forms.Platform.dll + True - - ..\packages\Xamarin.Forms.3.4.0.1009999\lib\netstandard2.0\Xamarin.Forms.Xaml.dll + + ..\packages\Xamarin.Forms.4.6.0.800\lib\netstandard2.0\Xamarin.Forms.Xaml.dll + True @@ -114,9 +117,9 @@ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - + + - + \ No newline at end of file diff --git a/src/FreshMvvm.Tests/packages.config b/src/FreshMvvm.Tests/packages.config index f27d7f1..0282de7 100644 --- a/src/FreshMvvm.Tests/packages.config +++ b/src/FreshMvvm.Tests/packages.config @@ -17,5 +17,5 @@ - + \ No newline at end of file diff --git a/src/FreshMvvm/FreshBasePageModel.cs b/src/FreshMvvm/FreshBasePageModel.cs index 889b36c..0e8355c 100644 --- a/src/FreshMvvm/FreshBasePageModel.cs +++ b/src/FreshMvvm/FreshBasePageModel.cs @@ -57,6 +57,15 @@ public virtual void Init (object initData) { } + /// + /// This method is called when the PageModel is loaded, the initData is the data that's sent from pagemodel before + /// + /// Data that's sent to this PageModel from the pusher + public virtual Task InitAsync (object initData) + { + return Task.CompletedTask; + } + protected void RaisePropertyChanged ([CallerMemberName] string propertyName = null) { var handler = PropertyChanged; diff --git a/src/FreshMvvm/FreshMvvm.csproj b/src/FreshMvvm/FreshMvvm.csproj index 0d5a52f..7877332 100644 --- a/src/FreshMvvm/FreshMvvm.csproj +++ b/src/FreshMvvm/FreshMvvm.csproj @@ -16,7 +16,7 @@ - + diff --git a/src/FreshMvvm/FreshPageModelResolver.cs b/src/FreshMvvm/FreshPageModelResolver.cs index 74c54d3..cc42916 100644 --- a/src/FreshMvvm/FreshPageModelResolver.cs +++ b/src/FreshMvvm/FreshPageModelResolver.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Xamarin.Forms; namespace FreshMvvm @@ -7,31 +8,31 @@ public static class FreshPageModelResolver { public static IFreshPageModelMapper PageModelMapper { get; set; } = new FreshPageModelMapper(); - public static Page ResolvePageModel () where T : FreshBasePageModel + public static async Task ResolvePageModel () where T : FreshBasePageModel { - return ResolvePageModel (null); + return await ResolvePageModel (null); } - public static Page ResolvePageModel (object initData) where T : FreshBasePageModel + public static async Task ResolvePageModel (object initData) where T : FreshBasePageModel { var pageModel = FreshIOC.Container.Resolve (); - return ResolvePageModel (initData, pageModel); + return await ResolvePageModel (initData, pageModel); } - public static Page ResolvePageModel (object data, T pageModel) where T : FreshBasePageModel + public static async Task ResolvePageModel (object data, T pageModel) where T : FreshBasePageModel { var type = pageModel.GetType (); - return ResolvePageModel (type, data, pageModel); + return await ResolvePageModel (type, data, pageModel); } - public static Page ResolvePageModel (Type type, object data) + public static async Task ResolvePageModel (Type type, object data) { var pageModel = FreshIOC.Container.Resolve (type) as FreshBasePageModel; - return ResolvePageModel (type, data, pageModel); + return await ResolvePageModel (type, data, pageModel); } - public static Page ResolvePageModel (Type type, object data, FreshBasePageModel pageModel) + public static async Task ResolvePageModel (Type type, object data, FreshBasePageModel pageModel) { var name = PageModelMapper.GetPageTypeName (type); var pageType = Type.GetType (name); @@ -40,17 +41,18 @@ public static Page ResolvePageModel (Type type, object data, FreshBasePageModel var page = (Page)FreshIOC.Container.Resolve (pageType); - BindingPageModel(data, page, pageModel); + await BindingPageModel(data, page, pageModel); return page; } - public static Page BindingPageModel(object data, Page targetPage, FreshBasePageModel pageModel) + public static async Task BindingPageModel(object data, Page targetPage, FreshBasePageModel pageModel) { pageModel.WireEvents (targetPage); pageModel.CurrentPage = targetPage; pageModel.CoreMethods = new PageModelCoreMethods (targetPage, pageModel); pageModel.Init (data); + await pageModel.InitAsync(data); targetPage.BindingContext = pageModel; return targetPage; } diff --git a/src/FreshMvvm/NavigationContainers/FreshMasterDetailNavigationContainer.cs b/src/FreshMvvm/NavigationContainers/FreshMasterDetailNavigationContainer.cs index ea24df1..263ac92 100644 --- a/src/FreshMvvm/NavigationContainers/FreshMasterDetailNavigationContainer.cs +++ b/src/FreshMvvm/NavigationContainers/FreshMasterDetailNavigationContainer.cs @@ -39,9 +39,9 @@ protected virtual void RegisterNavigation () FreshIOC.Container.Register (this, NavigationServiceName); } - public virtual void AddPage (string title, object data = null) where T : FreshBasePageModel + public virtual async Task AddPage(string title, object data = null) where T : FreshBasePageModel { - var page = FreshPageModelResolver.ResolvePageModel (data); + var page = await FreshPageModelResolver.ResolvePageModel (data); page.GetModel ().CurrentNavigationServiceName = NavigationServiceName; _pagesInner.Add(page); var navigationContainer = CreateContainerPage (page); @@ -50,10 +50,10 @@ public virtual void AddPage (string title, object data = null) where T : Fres if (_pages.Count == 1) Detail = navigationContainer; } - public virtual void AddPage(string modelName, string title, object data = null) + public virtual async Task AddPage(string modelName, string title, object data = null) { var pageModelType = Type.GetType(modelName); - var page = FreshPageModelResolver.ResolvePageModel(pageModelType, null); + var page = await FreshPageModelResolver.ResolvePageModel(pageModelType, null); page.GetModel().CurrentNavigationServiceName = NavigationServiceName; _pagesInner.Add(page); var navigationContainer = CreateContainerPage(page); diff --git a/src/FreshMvvm/NavigationContainers/FreshNavigationContainer.cs b/src/FreshMvvm/NavigationContainers/FreshNavigationContainer.cs index 2d94bd8..1ea4a2c 100644 --- a/src/FreshMvvm/NavigationContainers/FreshNavigationContainer.cs +++ b/src/FreshMvvm/NavigationContainers/FreshNavigationContainer.cs @@ -41,14 +41,15 @@ protected virtual Page CreateContainerPage (Page page) return new NavigationPage (page); } - public virtual Task PushPage (Xamarin.Forms.Page page, FreshBasePageModel model, bool modal = false, bool animate = true) + public virtual async Task PushPage(Xamarin.Forms.Page page, FreshBasePageModel model, bool modal = false, bool animate = true) { if (modal) - return Navigation.PushModalAsync (CreateContainerPageSafe (page), animate); - return Navigation.PushAsync (page, animate); + await Navigation.PushModalAsync(CreateContainerPageSafe(page), animate); + + await Navigation.PushAsync(page, animate); } - public virtual Task PopPage (bool modal = false, bool animate = true) + public virtual Task PopPage (bool modal = false, bool animate = true) { if (modal) return Navigation.PopModalAsync (animate); diff --git a/src/FreshMvvm/NavigationContainers/FreshTabbedFONavigationContainer.cs b/src/FreshMvvm/NavigationContainers/FreshTabbedFONavigationContainer.cs index cc45d07..3a1c1d0 100644 --- a/src/FreshMvvm/NavigationContainers/FreshTabbedFONavigationContainer.cs +++ b/src/FreshMvvm/NavigationContainers/FreshTabbedFONavigationContainer.cs @@ -33,9 +33,9 @@ protected void RegisterNavigation () FreshIOC.Container.Register (this, NavigationServiceName); } - public virtual Page AddTab (string title, string icon, object data = null) where T : FreshBasePageModel + public virtual async Task AddTab(string title, string icon, object data = null) where T : FreshBasePageModel { - var page = FreshPageModelResolver.ResolvePageModel (data); + var page = await FreshPageModelResolver.ResolvePageModel (data); page.GetModel ().CurrentNavigationServiceName = NavigationServiceName; _tabs.Add (page); var container = CreateContainerPageSafe (page); diff --git a/src/FreshMvvm/NavigationContainers/FreshTabbedNavigationContainer.cs b/src/FreshMvvm/NavigationContainers/FreshTabbedNavigationContainer.cs index 610e898..5258e42 100644 --- a/src/FreshMvvm/NavigationContainers/FreshTabbedNavigationContainer.cs +++ b/src/FreshMvvm/NavigationContainers/FreshTabbedNavigationContainer.cs @@ -27,9 +27,9 @@ protected void RegisterNavigation () FreshIOC.Container.Register (this, NavigationServiceName); } - public virtual Page AddTab (string title, string icon, object data = null) where T : FreshBasePageModel + public virtual async Task AddTab(string title, string icon, object data = null) where T : FreshBasePageModel { - var page = FreshPageModelResolver.ResolvePageModel (data); + var page = await FreshPageModelResolver.ResolvePageModel (data); page.GetModel ().CurrentNavigationServiceName = NavigationServiceName; _tabs.Add (page); var navigationContainer = CreateContainerPageSafe (page); diff --git a/src/FreshMvvm/PageModelCoreMethods.cs b/src/FreshMvvm/PageModelCoreMethods.cs index ad089de..aebb223 100644 --- a/src/FreshMvvm/PageModelCoreMethods.cs +++ b/src/FreshMvvm/PageModelCoreMethods.cs @@ -56,7 +56,7 @@ public async Task PushPageModel (object data, bool modal = false, bool { T pageModel = FreshIOC.Container.Resolve (); TPage page = FreshIOC.Container.Resolve(); - FreshPageModelResolver.BindingPageModel(data, page, pageModel); + await FreshPageModelResolver.BindingPageModel(data, page, pageModel); await PushPageModelWithPage(page, pageModel, data, modal, animate); } @@ -74,7 +74,7 @@ public Task PushPageModel(Type pageModelType, object data, bool modal = false, b async Task PushPageModel(FreshBasePageModel pageModel, object data, bool modal = false, bool animate = true) { - var page = FreshPageModelResolver.ResolvePageModel(data, pageModel); + var page = await FreshPageModelResolver.ResolvePageModel(data, pageModel); await PushPageModelWithPage(page, pageModel, data, modal, animate); } @@ -133,14 +133,14 @@ public async Task PopPageModel (object data, bool modal = false, bool animate = await PopPageModel (modal, animate); } - public Task PushPageModel (bool animate = true) where T : FreshBasePageModel + public async Task PushPageModel(bool animate = true) where T : FreshBasePageModel { - return PushPageModel (null, false, animate); + await PushPageModel(null, false, animate); } - public Task PushPageModel (bool animate = true) where T : FreshBasePageModel where TPage : Page + public async Task PushPageModel(bool animate = true) where T : FreshBasePageModel where TPage : Page { - return PushPageModel (null, animate); + await PushPageModel(null, animate); } public Task PushNewNavigationServiceModal (FreshTabbedNavigationContainer tabbedNavigationContainer, FreshBasePageModel basePageModel = null, bool animate = true) @@ -167,9 +167,9 @@ public Task PushNewNavigationServiceModal (FreshMasterDetailNavigationContainer return PushNewNavigationServiceModal (masterDetailContainer, models.ToArray(), animate); } - public Task PushNewNavigationServiceModal (IFreshNavigationService newNavigationService, FreshBasePageModel basePageModels, bool animate = true) + public async Task PushNewNavigationServiceModal (IFreshNavigationService newNavigationService, FreshBasePageModel basePageModels, bool animate = true) { - return PushNewNavigationServiceModal (newNavigationService, new FreshBasePageModel[] { basePageModels }, animate); + await PushNewNavigationServiceModal (newNavigationService, new FreshBasePageModel[] { basePageModels }, animate); } public async Task PushNewNavigationServiceModal (IFreshNavigationService newNavigationService, FreshBasePageModel[] basePageModels, bool animate = true) @@ -195,7 +195,7 @@ public void SwitchOutRootNavigation (string navigationServiceName) if (!(rootNavigation is Page)) throw new Exception("Navigation service is not a page"); - Xamarin.Forms.Application.Current.MainPage = rootNavigation as Page; + Application.Current.MainPage = rootNavigation as Page; } public async Task PopModalNavigationService(bool animate = true) @@ -238,7 +238,7 @@ public Task SwitchSelectedMaster() where T : FreshBasePag public async Task PushPageModelWithNewNavigation (object data, bool animate = true) where T : FreshBasePageModel { - var page = FreshPageModelResolver.ResolvePageModel(data); + var page = await FreshPageModelResolver.ResolvePageModel(data); var navigationName = Guid.NewGuid().ToString(); var naviationContainer = new FreshNavigationContainer(page, navigationName); await PushNewNavigationServiceModal(naviationContainer, page.GetModel(), animate);