Martijn van Dijk - Microsoftxamarinuniversity.blob.core.windows.net/guestlectures/m... ·...

Post on 04-Apr-2020

4 views 0 download

Transcript of Martijn van Dijk - Microsoftxamarinuniversity.blob.core.windows.net/guestlectures/m... ·...

MvvmCrossBuilding Native Cross-Platform Apps

Martijn van Dijkgithub.com/martijn00speakerdeck.com/martijn00

@mhvdijkmhvdijk@gmail.com

1

Progress is teamwork

2

The history ofMvvmCross

3

Started by Stuart Lodge

Started as fork of MonoCross (Mvc framework)

November 2012

4

Evolved into MvvmCross

Taken over by

● Tomasz Cielecki / Cheesebaron

● Martijn van Dijk / Martijn00

+ Many others

June 2013

5

Android support added

June 2015

Xamarin.Forms added

August 2015

Plugin structure added

September 2015

6

iOS supportadded

February 2016 And more in the future!

7

WhyMvvmCross?

8

9

Cross platform awesomeness!

Support for all major platforms

Most advanced Mvvm library for Xamarin and

.NET cross platform

10

Large and engaged community

Fast release cycle

Clean & easy conventions

11

I love MvvmCross

I am really impressed

with MvvmCross

Miguel de IcazaXamarin CTO

Scott HanselmanMicrosoft Developer

Evangelist

12

Why Mvvm?

View Binder ViewModel Model

Button

Text

1. Action

1. Action

3. Command

5. Notify change

6. Change data

4. Access data

2. Event handling

13

MvvmCross Supported platforms

■ Android■ iOS■ Windows■ Xamarin.Forms■ Mac

14

MvvmCross Highlights

■ Flexible architecture■ PCL based■ Inversion of Control■ Dependency injection

■ Value Converters■ Bindings■ Testable■ Plugins

15

■ Github.com/MvvmCross■ MvvmCross.com■ Slack (#mvvmcross)■ Stackoverflow■ Xamarin Forums

MvvmCross Resources

16

Let take a look at setting up a basic project

17

Bindings

iOS:

var set = this.CreateBindingSet<MainViewController, MainViewModel>();set.Bind(Label).To(vm => vm.Title);set.Apply();

Android:

local:MvxBind="Text Title"

18

Presenters

Specifications

■ Customize view presentation■ Platform-specific■ Still retain View Model logic■ Presentation hints

Examples

■ Tabs / Panorama■ Split View / Master-Detail■ Fragments■ Modals■ Hamburger menu

19

■ Accelerometer■ Download Cache■ Email■ File■ Json■ Localization■ Location

Plugins available athttps://github.com/MvvmCross/MvvmCross-Plugins

■ Messenger■ Phone Call■ Picture Chooser■ SQLite■ Visibility■ Web Browser + Many More!

20

MvvmCross Plugins

Messengerpublic class LocationViewModel : MvxViewModel { private readonly MvxSubscriptionToken _token;

public LocationViewModel(IMvxMessenger messenger) { _token = messenger.Subscribe<LocationMessage>(OnLocationMessage); }

private void OnLocationMessage(LocationMessage locationMessage) { Lat = locationMessage.Lat; Lng = locationMessage.Lng; } } 21

Generics

■ MvvmCross uses CoC (Convention over Configuration) by default- LoginView > LoginViewModel

■ Generics can be used too- LoginView : MvxActivity<LoginViewModel>- MainView : MvxActivity<SomeDifferentNameViewModel>

■ Possible to override in setup.cs- protected override IDictionary<Type, Type>

GetViewModelViewLookup()22

IoC (Inversion of Control)

1. Use interfaces2. Define implementation of interfaces at runtime3. Job done! :)

■ Singleton: Mvx.RegisterSingleton<T>();■ Lazy: Mvx.ConstructAndRegisterSingleton<T>();■ Dynamic: Mvx.RegisterType<T>();

Mvx.Resolve<T>();23

Dependency Injection

public class MyViewModel : MvxViewModel { public MyViewModel(IMvxJsonConverter jsonConverter, IMvxGeoLocationWatcher locationWatcher) { // Do stuff.... } }

24

See it in action,demo time!

25

Material Design support for MvvmCross

■ Design- NavigationView- FloatingActionButton

■ AppCompat- android:Theme- Toolbar- DrawerToggle

■ V4- DrawerLayout- SwipeRefresh- ViewPager (FragmentStatePager)

■ LeanBack■ Preference

- Compat Fragments■ Fragging

- V4 Fragments- MvxCachingFragmentActivity

■ RecyclerView- ItemTouchHelper for Xamarin

26

Other Material &Android support libraries

■ Cardview■ Pallete■ Gridlayout■ Mediarouter■ V8 Support

■ V13 Support■ Annotations support■ Custom tabs■ Percent support■ Recommendation support

27

Testingusing MvvmCross.Test.Core;using Moq;using NUnit.Framework;

[TestFixture]public class MyTest : MvxIoCSupportingTest{ [Test] public void TestViewModel() { base.Setup(); // from MvxIoCSupportingTest

// your test code }} 28

Tips

■ Keep it simple■ Separation of Concerns■ Don’t try to invent the wheel

again, use plugins, samples, etc.

■ Use the Analysis plugin to fix common mistakes

29

Get help on Slack

xamarinchat.herokuapp.com #MvvmCross channel

Follow influencers#MvvmCross

@Mhvdijk@Cheesebaron@MvvmCross

Join the LinkedIn group

linkedin.com/groups/8456977MvvmCross & Xamarin group

Contribute on Github

github.com/MvvmCross/MvvmCross

30

Get involved!

Questions?Martijn van Dijk

github.com/martijn00speakerdeck.com/martijn00

@mhvdijkmhvdijk@gmail.com

31