Впервые погружаюсь в разработку мобильных приложений на .NET(MAUI) и задаю пару вопросов о том, "Как это сделать" и "Какое решение лучше".
Q1. В конце концов я реализовал вход в Google в приложении MAUI с помощью внедрения зависимостей. У меня есть GoogleLoginActivity(AppCompatActivity) на платформе Android, которая получает данные из API Google и вручную десериализует их в пользовательский объект класса User.
Вызов активности из GoogleAuthService (платформа Android):
Platform.CurrentActivity.StartActivity(typeof(GoogleLoginActivity));
Инъекция платформы:
builder.Services.AddSingleton<IGoogleAuthService, GoogleAuthService>();
Итак, следующая задача — передать объект User из Android Activity в MAUI MainPage ViewModel или даже на любую другую страницу в проекте (например, на страницу LoginConfirmation). Итак, каковы мои варианты?
Приложение десериализует GoogleSignInAccount объект в переопределении OnActivityResult и вызывает Activity.Finish()
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
if (requestCode == Constants.RC_SIGN_IN)
{
Task<GoogleSignInAccount> task = GoogleSignIn.GetSignedInAccountFromIntentAsync(data);
HandleResult(task);
}
}
private void googleSignIn()
{
....
}
private async void HandleResult(Task<GoogleSignInAccount> result)
{
....
Finish();
}
Я пробовал навигацию по оболочке (Shell.Current.GoToAsync("MainPage"))
с объектом в QueryProperty, но он не работает (в моем примере кода нет QueryProperty).
protected override void OnDestroy()
{
base.OnDestroy();
try
{
Shell.Current.GoToAsync("MainPage");
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex);
Shell.Current.DisplayAlert("error", ex.Message, "error");
}
}
Также в качестве опции можно сериализовать весь объект в соответствии с настройками, но я думаю, что это плохой стиль кодирования, и я не уверен, что он сработает.
Q2. Предположим, у меня есть зарегистрированный пользователь, и мне нужно периодически сохранять и проверять некоторые пользовательские данные в моем приложении. Как лучше всего хранить пользовательские данные (ID, GUid, имя пользователя и т. д.) в приложении. Я представляю что-то вроде сессий в WebForms, но, насколько я знаю, сессий в MAUI нет.
Файлы cookie (есть ли файлы cookie в мобильном приложении?)? Настройки (объект пользователя слишком сложен?)? Другие варианты?
Спасибо.
UPD: Глупый я. Вопрос 1 решен. Я совершил ошибку новичка и забыл внести изменения в App.xaml.cs:
MainPage = new NavigationPage(new MainPage());
к
MainPage = new AppShell();
Так что даже из AppCompatActivity я могу сделать
Shell.Current.GoToAsync("PostGoogleSignin", true,
new Dictionary<string, object>
{
{ "User", resultUser }
});
и получить пользователя на другой стороне. Спасибо за ответы.
Кстати, это Xamarin или MAUI? Не может быть и того, и другого.
Насколько мне известно, MAUI на базе Xamarin и подходы из Xamarin можно реализовать в MAUI. Но я удаляю тег Xamarin, если так лучше.
Да, он основан на Xamarin, но он по-прежнему сильно отличается во многих аспектах, и вы не можете использовать оба одновременно. Можно повторно использовать и переносить существующие компоненты из Xamarin, но при использовании MAUI вы не используете Xamarin (за исключением некоторых общих функций .NET). Для ясности вам следует удалить Xamarin, если вы имеете дело с проектом MAUI.





Вы можете передать весь объект/класс в качестве параметра навигации.
MyObjectClass MyObject = new();
var navigationParameter = new Dictionary<string, object>
{
{ "MyObject", MyObject }
};
await Shell.Current.GoToAsync($"/mypage", navigationParameter);
Затем в вашем коде (mypage) вы получите объект в новое свойство myobject:
[QueryProperty(nameof(MyObjectClass), "MyObjectNameString")]
public partial class GroupMatchPage : ContentPage
{
MyObjectClass myobject;
public MyObject MyObject
{
get => myobject;
set
{
myobject = value;
}
}
}
Согласно вашему второму вопросу, вы можете сохранить данные пользователя в простой файл json и отслеживать весь процесс по мере необходимости.
Надеюсь, это поможет.
Ты прав, приятель. Shell.Current.GoToAsync("MainPage") тоже работает. Глупый я забыл изменить MainPage = new NavigationPage(new MainPage()); на MainPage = new AppShell(); Спасибо за ваш ответ. Вы считаете, что файл JSON достаточно безопасен?
Да, хранилище безопасно, и простой json — самый простой способ сделать это. Спасибо!
Добро пожаловать в СО. Без некоторого кода и более точного объяснения вашей реальной проблемы никто не сможет вам помочь. Учтите это: stackoverflow.com/help/how-to-ask Также не забудьте предоставить код и другую информацию в виде текста и использовать функции форматирования кода.