Pasing data to viewModel contractor

Eduardo Gomez 3,671 Reputation points
2024-03-10T00:24:52.37+00:00

Since I need m data immediately, I decide to pass my class to the WelomePage Contractor

public partial class WelcomePageViewModel : BaseViewModel {

    DemyUser? loggedUser;

    public WelcomePageViewModel(DemyUser demyUser) {

        loggedUser = demyUser;
        GetShellItems(loggedUser.CurrentRole);
    }



 private async void CheckAuth() {
     var currentUserAsJson = await SecureStorage.GetAsync(Constants.LOGGED_USER);
     if(string.IsNullOrEmpty(currentUserAsJson)) {
         if(DeviceInfo.Platform == DevicePlatform.WinUI) {
             Shell.Current.Dispatcher.Dispatch(async () => {
                 await Shell.Current.GoToAsync($"//{nameof(LoginPage)}", true);
             });
         } else {
             await Shell.Current.GoToAsync($"//{nameof(LoginPage)}", true);
         }
     } else {
         var loggedUser = JsonSerializer.Deserialize<DemyUser>(currentUserAsJson);
         FlyoutHeaderHelper.CreateFlyoutHeader(loggedUser);
         WelcomePageViewModel welcomePageViewModel = new(loggedUser);
         await Shell.Current.GoToAsync($"//{nameof(WelcomePage)}", true);
     }


in the startup page I have a method, to check if I am authenticated.But what I do not understand I the error that I get

System.InvalidOperationException: 'Unable to resolve service for type 'DemyAI.Models.DemyUser' while attempting to activate 'DemyAI.ViewModels.WelcomePageViewModel'.'

DemyUser is a class, not a service nor an interface.

builder.Services.AddSingleton<HttpClient>();
builder.Services.AddSingleton(AudioManager.Current);
builder.Services.AddSingleton<IAppService, AppService>();
builder.Services.AddSingleton(typeof(IDataService<>), typeof(DataService<>));
builder.Services.AddSingleton<IAuthenticationService, AuthenticationService>();
builder.Services.AddSingleton<IHttpService, HttpService>();
builder.Services.AddSingleton(Connectivity.Current);
builder.Services.AddSingleton(firebaseAuthClient);
builder.Services.AddSingleton<AppShell>();
builder.Services.AddSingleton<NoInternetPage>();
builder.Services.AddSingleton<LoginPage>();
builder.Services.AddSingleton<WelcomePage>();
builder.Services.AddSingleton<NewLecturePage>();
builder.Services.AddSingleton<NewTestPage>();
builder.Services.AddSingleton<ScheduleLecturePage>();
builder.Services.AddSingleton<ScheduleTestPage>();
builder.Services.AddSingleton<NotificationsPage>();
builder.Services.AddSingleton<JoinMeetingPage>();
builder.Services.AddSingleton<ManageCoursePage>();
builder.Services.AddSingleton<StartupPage>();
builder.Services.AddSingleton<RoleSelectionPage>();
builder.Services.AddSingleton<AppShellViewModel>();
builder.Services.AddSingleton<LoginPageViewModel>();
builder.Services.AddSingleton<WelcomePageViewModel>();
builder.Services.AddSingleton<NewLecturePageViewModel>();
builder.Services.AddSingleton<NewTestPageViewMode>();
builder.Services.AddSingleton<ScheduleLecturePageViewModel>();
builder.Services.AddSingleton<ScheduleTestPageViewModel>();
builder.Services.AddSingleton<JoinMeetingPageViewModel>();
builder.Services.AddSingleton<ManageCoursePageViewModel>();
builder.Services.AddSingleton<NotificationsPageViewModel>();
builder.Services.AddSingleton<StartupPageViewModel>();
builder.Services.AddSingleton<FlyoutHeaderViewModel>();
builder.Services.AddSingleton<RoleSelectionPageViewModel>();


I also tried this.

WelcomePage welcomePage = new(new WelcomePageViewModel(loggedUser));


and become I need to crate shell Items dynamically

I added this

 private DemyUser? loggedUser;
    public WelcomePageViewModel(DemyUser? loggedUser) {
        this.loggedUser = loggedUser;
        GetShellItems(loggedUser?.CurrentRole);
    }
    private void GetShellItems(string? currentRole) {
        switch(currentRole) {
            case nameof(Role.Teacher):
                break;
            case nameof(Role.Coordinator):
                break;
            case nameof(Role.Student):
                Debug.WriteLine("d");
                break;
            default:
                break;
        }
    }
}

User's image

Developer technologies | .NET | .NET MAUI
{count} votes

1 answer

Sort by: Most helpful
  1. Eduardo Gomez 3,671 Reputation points
    2024-03-11T18:13:16.4033333+00:00

    I fix it, since we are using dependency injection. We cannot send classes thru the contractor of the page.


Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.