Implement a prism in an existing Xamarin.Forms application

I would like to know that there is an effective way to implement Prism in an existing Xamarin.Forms Shared project. I am sure that others would also like to know if they can profit from what Prism offers without having to convert their existing project to a PCL project. All the existing examples that I found show the PCL project (probably for a good reason).

To try to implement Prism in my project, I installed the necessary Prims.Unity.Forms module for each platform project. I tried to inherit from PrismApplication:

public partial class App : PrismApplication 
{ }

But that does not work. The app class does not allow me to inherit from another base class.

Adding the following lines to my Android project did not help:

protected override void OnCreate(Bundle bundle)
{      
   LoadApplication(new App(new AndroidInitializer()));
}

public class AndroidInitializer : IPlatformInitializer
{
   public void RegisterTypes(IUnityContainer container)
   { }
}

, - -, .

+4
1

, .

-, , nuget .

, Prism Unity :

  <package id="Prism.Core" version="6.3.0" ... />
  <package id="Prism.Forms" version="6.3.0" .../>
  <package id="Prism.Unity.Forms" version="6.3.0" ... />
  <package id="Unity" version="4.0.1" ... />

( )

enter image description here

Views, , .

XAML.

using Prism.Unity;
using Xamarin.Forms;

namespace XamPrismShared
{
    public partial class App : PrismApplication
    {
        public App (IPlatformInitializer platformInitializer):base(platformInitializer)
        {                       
        }

    }
}

ViewModel

OnInitialized RegisterTypes. , , Prism, .

using Prism.Unity;
using Xamarin.Forms;

namespace XamPrismShared
{
    public partial class App : PrismApplication
    {
        public App (IPlatformInitializer platformInitializer):base(platformInitializer)
        {                       
        }

        protected override void OnInitialized()
        {
            InitializeComponent();
            NavigationService.NavigateAsync("MainPage");
        }

        protected override void RegisterTypes()
        {
            Container.RegisterTypeForNavigation<NavigationPage>();
            Container.RegisterTypeForNavigation<MainPage>();            
        }                
    }
}

ViewModelLocator.AutowireViewModel="True" , ViewModel.

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True" x:Class="x:Class="XamPrismShared.Views.MainPage"" Title="MainPage">
   <Label Text="{Binding Title}" 
           VerticalOptions="Center" 
           HorizontalOptions="Center" />
</ContentPage>

ViewModel

enter image description here

using Prism.Mvvm;

namespace XamPrismShared.ViewModels
{
    public class MainPageViewModel : BindableBase
    {
        public MainPageViewModel()
        {
            Title = "Hi from Prism.";
        }

        public string Title { get; set; }
    }
}

Xamarin.Forms.

  • Android
    using Android.App;
    using Android.Content.PM;
    using Android.OS;
    using Microsoft.Practices.Unity;
    using Prism.Unity;

    namespace XamPrismShared.Droid
    {
        [Activity (Label = "XamPrismShared", Icon = "@drawable/icon", Theme="@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
        public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
        {
            protected override void OnCreate (Bundle bundle)
            {
                TabLayoutResource = Resource.Layout.Tabbar;
                ToolbarResource = Resource.Layout.Toolbar; 

                base.OnCreate (bundle);

                global::Xamarin.Forms.Forms.Init (this, bundle);
                LoadApplication (new XamPrismShared.App(new AndroidPlatformInitializer()));
            }
        }

        public class AndroidPlatformInitializer : IPlatformInitializer
        {
            public void RegisterTypes(IUnityContainer container)
            {

            }
        }
    }

  • iOS
    using Foundation;
    using Microsoft.Practices.Unity;
    using Prism.Unity;
    using UIKit;

    namespace XamPrismShared.iOS
    {   
        [Register("AppDelegate")]
        public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
        {
            public override bool FinishedLaunching(UIApplication app, NSDictionary options)
            {
                global::Xamarin.Forms.Forms.Init ();
                LoadApplication (new XamPrismShared.App(new iOSPlatformInitializer()));

                return base.FinishedLaunching (app, options);
            }
        }

        public class iOSPlatformInitializer : IPlatformInitializer
        {
            public void RegisterTypes(IUnityContainer container)
            {

            }
        }
    }

voilà

enter image description here

, Github https://github.com/jesulink2514/Xamarin-Prism-shared-project

+10

Source: https://habr.com/ru/post/1682119/


All Articles