Search code examples
c#xamarinxamarin.formsmvvmcross

xamarin forms mvvm Missing default constructor for


I have create a MessageCenterService interface

public interface IDialogService
{
    Task Toasting(string title);
}

public class DialogService : IDialogService
{
    public async Task Toasting(string title)
    {
        using (var Dialog = UserDialogs.Instance.Toast(title, null))    
        {
            await Task.Delay(1000);
        }
    }
}   

Now I'm trying dependency inject but:

public class LoginViewModel : BaseViewModel
{
    private IDialogService _dialogService;

    public ICommand LoginCommand { get; set; }

    public LoginViewModel(IDialogService dialogService)
    {
        _dialogService = dialogService;
        LoginCommand = new Command(Login);  
    }
}   

Erro => Missing default constructor for "..LoginViewModel"

LoginPage.xaml

  <ContentPage.BindingContext>
        <viewModels:LoginViewModel/>
  </ContentPage.BindingContext>

But if I put:

public LoginViewModel(){}

public LoginViewModel(IDialogService dialogService) //:Base() :this
{
    _dialogService = dialogService;
    ...
}

Error disappear but IDialogService never is instantiate _dialogService always null

LoginPage.xaml.cs changes not working too..

public LoginPage()
{
    InitializeComponent();
}

public LoginPage(IDialogService dialogService): base()
{
    InitializeComponent();
}

I am missing something? Thanks in advance

https://forums.xamarin.com/discussion/48009/pop-display-alert-message-from-viewmodel Missing Default Constructor error in Xamarin Forms Xamarin Forms -> System.MissingMethodException: Default constructor not found for [Interface] Missing Default Constructor error in Xamarin Forms


Solution

  • Try to use the DependencyService or 3rd party libraries like TinyIOC. Here is my sample code using the DependencyService. You can register your service using DependencyService.Register<>() and simply invoke it using DependencyService.Get<>();

    App.xaml.cs

    public App()
    {
       ...
       DependencyService.Register<DialogService>();
       ...
    }
    
    

    LoginPage.xaml.cs

    LoginPage()
    {
       InitializeComponent();
       BindingContext = new LoginViewModel();
    }
    

    LoginViewModel.cs

    private IDialogService _dialogService;
    
    public LoginViewModel()
    {
       ...
       _dialogService = DependencyService.Get<DialogService>();;
       ...
    }