You MUST call Xamarin.Forms.Init (); before using it

In my app.xaml.cs, I create a new page.

 public App()
  {
      InitializeComponent();
      MainPage = new NavigationPage(new WrapLayoutPage());
  }

This page calls a static class that uses DependencyService to perform some tasks.

The line that throws the error:

var tmpTable = SqLiteHelper.GetItem<TableX>("someId");

SqLiteHelper:

public static class SqLiteHelper
{
    private static readonly SQLiteConnection DatabaseConnection = DependencyService.Get<ISqLite>().GetConnection();
    private static readonly object Locker = new object();

    public static DbObjectV3 GetItem<T>(Guid inId) where T : DbObjectV3, new()
    {
        lock (Locker)
        {
            var tmpItem = DatabaseConnection.Table<T>().FirstOrDefault(inItem => inItem.Id == inId);
            tmpItem.IsNewObject = false;
            return tmpItem;
        }
    }
}

This calls me TypeInitializationExceptionwith an InnerException:

You MUST call Xamarin.Forms.Init (); before using it

This has something to do with the static helper class, because before this call I can work with DependencyService without problems!

As mainlauncher, I use a splash screen. In this class, I do some startup work that relies on the DependencyService.

SplashScreen:

 [Activity(Theme = "@style/MyTheme.Splash", NoHistory = true, MainLauncher = true)]
    public class SplashScreen : Activity
    {
        static readonly string TAG = "X:" + typeof(SplashScreen).Name;

        public override void OnCreate(Bundle savedInstanceState, PersistableBundle persistentState)
        {
            base.OnCreate(savedInstanceState, persistentState);
            Log.Debug(TAG, "SplashActivity.OnCreate");
        }
}

My main activity:

 [Activity(Label = "FrameworkForms", Icon = "@drawable/icon", ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, Theme = "@style/MainActivityTheme", MainLauncher = false)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            Xamarin.Forms.Forms.Init(this, bundle);
            App.ScreenWidth = (double)(Resources.DisplayMetrics.WidthPixels / Resources.DisplayMetrics.Density);
            LoadApplication(new App());
        }
    }

Now, after changing the Activity in SplashScreen to FormsAppCompatActivity, I get another error.

Call Forms.Init () before hiding the keyboard

What's going on here?

+5
2

. OnCreate() SplashScreen.

SplashScreen :

 [Activity(Theme = "@style/MyTheme.Splash", NoHistory = true, MainLauncher = true)]
    public class SplashScreen : Activity
    {
        static readonly string TAG = "X:" + typeof(SplashScreen).Name;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Forms.Forms.Init(this, savedInstanceState);
            Log.Debug(TAG, "SplashActivity.OnCreate");
        }


        protected override void OnResume()
        {
            base.OnResume();

            Task tmpStartupWork = new Task(() =>
            {
                Log.Debug(TAG, "Performing some startup work that takes a bit of time.");
                StartUpTasks.InitializeDatabaseCreation();
                Log.Debug(TAG, "Working in the background - important stuff.");
            });

            tmpStartupWork.ContinueWith(inT =>
            {
                Log.Debug(TAG, "Work is finished - start MainActivity.");
                StartActivity(new Intent(Application.Context, typeof(MainActivity)));
            }, TaskScheduler.FromCurrentSynchronizationContext());

            tmpStartupWork.Start();
        }
    }

, Xamarin OnCreate() !

+6

. , .

public partial class AppDelegate : 
       global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate

:

using Xamarin.Forms.Platform.iOS;
public partial class AppDelegate : FormsApplicationDelegate

:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    global::Xamarin.Forms.Forms.Init();

, ... . :

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    this.Init();

. . , -:-) ...

0

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


All Articles