Since the first release of FreshMvvm it’s been a wild ride, the up take of FreshMvvm has been very impressive it’s really good to see others having success using FreshMvvm. While I’ve been using and loving FreshMvvm for a long long time, even since before it was called FreshMvvm, it’s great to see others also enjoying the Framework.
Since this release has a few large features and breaking changes I’ve decided bump the version up to 1.0 preview. Please see below of a description of the features.
Multiple Navigation Services
It’s always been possible to do any type of navigation in FreshMvvm, with custom or advanced scenarios were done by implementing a custom navigation service. Even with this ability people found it a little hard to do advanced navigation scenarios in FreshMvvm. After I reviewed all the support questions that came in for FreshMvvm I found that the basic issue people had was they wanted to be able to use our built in navigation containers multiple times, two primary examples are 1) within a master detail having a navigation stack in a master and another in the detail 2) The ability to push modally with a new navigation container. In order to support both these scenarios I concluded that the FreshMvvm required the ability to have named NavigationServices so that we could support multiple NavigationService’s.
Using multiple navigation containers
Below we’re running two navigation stacks, in a single MasterDetail.
var masterDetailsMultiple = new MasterDetailPage (); //generic master detail page //we setup the first navigation container with ContactList var contactListPage = FreshPageModelResolver.ResolvePageModel<ContactListPageModel> (); contactListPage.Title = "Contact List"; //we setup the first navigation container with name MasterPageArea var masterPageArea = new FreshNavigationContainer (contactListPage, "MasterPageArea"); masterPageArea.Title = "Menu"; masterDetailsMultiple.Master = masterPageArea; //set the first navigation container to the Master //we setup the second navigation container with the QuoteList var quoteListPage = FreshPageModelResolver.ResolvePageModel<QuoteListPageModel> (); quoteListPage.Title = "Quote List"; //we setup the second navigation container with name DetailPageArea var detailPageArea = new FreshNavigationContainer (quoteListPage, "DetailPageArea"); masterDetailsMultiple.Detail = detailPageArea; //set the second navigation container to the Detail MainPage = masterDetailsMultiple;
PushModally with new navigation stack
//push a basic page Modally var page = FreshPageModelResolver.ResolvePageModel<MainMenuPageModel> (); var basicNavContainer = new FreshNavigationContainer (page, "secondNavPage"); await CoreMethods.PushNewNavigationServiceModal(basicNavContainer, new FreshBasePageModel[] { page.GetModel() }); //push a tabbed page Modally var tabbedNavigation = new FreshTabbedNavigationContainer ("secondNavPage"); tabbedNavigation.AddTab<ContactListPageModel> ("Contacts", "contacts.png", null); tabbedNavigation.AddTab<QuoteListPageModel> ("Quotes", "document.png", null); await CoreMethods.PushNewNavigationServiceModal(tabbedNavigation); //push a master detail page Modally var masterDetailNav = new FreshMasterDetailNavigationContainer ("secondNavPage"); masterDetailNav.Init ("Menu", "Menu.png"); masterDetailNav.AddPage<ContactListPageModel> ("Contacts", null); masterDetailNav.AddPage<QuoteListPageModel> ("Quotes", null); await CoreMethods.PushNewNavigationServiceModal(masterDetailNav);
Custom IOC Container
The second major request for FreshMvvm 1.0 was to allow custom IOC containers. In the case that your application already has a container that you want to leverage.
Using a custom IOC container is very simple in that you only need to implement a single interface.
public interface IFreshIOC { object Resolve(Type resolveType); void Register<RegisterType>(RegisterType instance) where RegisterType : class; void Register<RegisterType>(RegisterType instance, string name) where RegisterType : class; ResolveType Resolve<ResolveType>() where ResolveType : class; ResolveType Resolve<ResolveType>(string name) where ResolveType : class; void Register<RegisterType, RegisterImplementation> () where RegisterType : class where RegisterImplementation : class, RegisterType; }
And then set the IOC container in the System.
FreshIOC.OverrideContainer(myContainer);
Breaking Changes
Please remember whenever you register a IFreshNavigationService it now has to have a name.
FreshIOC.Container.Register<IFreshNavigationService> (this, Constants.DefaultNavigationServiceName);
Please find this pre-release in nuget. – https://www.nuget.org/packages/FreshMvvm/1.0.0-pre1
FYI – This nuget is a pre-release nuget and you’ll need to have the ‘pre-release’ option selected on nuget.
The main repo for FreshMvvm can be found on github – https://github.com/rid00z/FreshMvvm.
Please post any issues on the github repository.
Thanks
Michael