5 votes

Implémenter Prism dans une application Xamarin.Forms partagée existante

Je voudrais savoir s'il existe un moyen valide d'implémenter Prism dans un projet Xamarin.Forms Shared existant. Je suis sûr que d'autres aimeraient également savoir s'ils peuvent profiter de ce que Prism a à offrir sans avoir à convertir leur projet existant en un projet PCL. Tous les exemples existants que j'ai trouvés montrent un projet PCL (probablement pour une bonne raison).

Pour essayer d'implémenter Prism dans mon projet, j'ai installé le nuget Prims.Unity.Forms dans chaque projet de plateforme. J'ai essayé d'hériter de PrismApplication :

public partial class App : PrismApplication 
{ }

Mais, cela ne fonctionne pas. La classe d'application ne me permet pas d'hériter d'une classe de base différente.

Ajouter les lignes suivantes à mon projet android n'a pas aidé :

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

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

Peut-être que je manque quelque chose ou que j'essaie quelque chose qui n'est pas structuralement possible.

13voto

Jesus Angulo Points 1954

Oui, c'est tout à fait possible.

Tout d'abord, assurez-vous que les packages NuGet sont installés.

Par exemple, pour Prism et Unity, vous avez besoin de :

Ajouter des dossiers manquants (juste pour l'ordre)

entrez la description de l'image ici

Et déplacez votre page existante vers le dossier Views, mais n'oubliez pas de ajuster les espaces de noms sinon votre liaison ne fonctionnera tout simplement pas.

Changer le type de base de l'application

N'oubliez pas de changer le type de base de l'application dans le code et le XAML.

using Prism.Unity;
using Xamarin.Forms;

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

    }
}

Définir la première page et son ViewModel

Implémentez OnInitialized et RegisterTypes. N'oubliez pas que vous devez enregistrer chaque type que vous souhaitez utiliser avec Prism en tant que page.

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();
            Container.RegisterTypeForNavigation();            
        }                
    }
}

Si vous avez des pages existantes

Ajoutez ViewModelLocator.AutowireViewModel="True" à vos vues existantes afin de permettre à Prism de se lier automatiquement à leur ViewModel respectif.

Ajouter le ViewModel manquant

entrez la description de l'image ici

using Prism.Mvvm;

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

        public string Title { get; set; }
    }
}

Ajouter des initialiseurs de plateforme dans chaque projet de plateforme

Ajoutez les initialiseurs de plateforme manquants et corrigez le chargement de Xamarin.Forms.

  • Pour 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)
            {
    
            }
        }
    }
  • Pour 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)
            {
    
            }
        }
    }

Et voilà

entrez la description de l'image ici

Si vous avez des questions ou souhaitez vérifier, vous pouvez consulter le code sur Github https://github.com/jesulink2514/Xamarin-Prism-shared-project

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X