Xamarin表单 - 实现Singleton

时间:2018-04-05 10:38:25

标签: c# xamarin xamarin.forms singleton

我实际上是想在Xamarin中存档全局变量,任何页面都可以使用它。经过大量的研究,看起来像存档这样的东西的最佳方式是使用Singleton设计模式。我很难实现这一点。看看......

global.cs

using System;

namespace xamarin_forms
{
    sealed class Global
    {
        public string test { get; set; }
        private static Global _instance = null;  

        private Global() 
        { 
        }

        static internal Global Instance() 
        {   
            if (_instance == null) 
            {  
                _instance = new Global();  
            }  

            return _instance;  
        }  
    }
}

App.xaml.cs

using Xamarin.Forms;

namespace xamarin_forms
{
    public partial class App : Application
    {
        Global global = Global.Instance();
        public App()
        {
            InitializeComponent();
            MainPage = new PageWelcome();
            global.test = "123";
        }

        protected override void OnStart()
        {


        }

        protected override void OnSleep()
        {
            // Handle when your app sleeps
        }

        protected override void OnResume()
        {
            // Handle when your app resumes
        }
    }
}

好的,到目前为止,我刚刚用一个简单的测试属性创建了我的单例类。我初始化我的应用程序时将其设置为123。

现在,在另一页,欢迎页面...我想读取我之前在初始化时设置的值...

PageWelcome.xaml.cs

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace xamarin_forms
{
    public partial class PageWelcome : ContentPage
    {
        public PageWelcome()
        {
            InitializeComponent();
            Global global = Global.Instance();
            DisplayAlert("Alert", global.test, "OK");
        }
    }
}

实际上这不起作用。它给我一个空的回报。那么,如何正确使用它?谢谢!

3 个答案:

答案 0 :(得分:2)

在App的构造函数中,首先创建一个PageWelcome的实例。此实例读取test单例的Global属性,并在警报中显示其内容。此时,就我所见,没有为该属性分配任何值。

只有在PageWelcome构造函数完成后,您才实际为单例的test属性赋值。将您的App构造函数更改为

public App()
{
    InitializeComponent();
    global.test = "123";
    MainPage = new PageWelcome();
}

它应该按预期工作。

答案 1 :(得分:2)

您不需要单身人士。 只需用变量static创建一个静态类,你就可以在任何页面上使用它们,就像你想要全局变量一样。

答案 2 :(得分:0)

// 1. Create static class Global with string _Test
public static class Global
{
    public static void Init()
    {
        // your init class
    }

    private static string _Test { get; set; }
    public static string Test
    {
        get => return _Test;
        set => _Test = value;
    }
}

// 2. Init Global in your App.cs
public App()
{
    Global.Init();
}
// 3. Then use them on any page
public PageWelcome()
{
    Global.Test = "123";
}