У меня есть класс ChangeNotifierProvider, который предоставляет всплывающее окно для своих Consumer Widgets. Всплывающая функция под названием «showPopup» содержит выпуклую кнопку, при нажатии которой пользователь входит в систему с помощью Google, извлекает его информацию, отправляет ее в базу данных mysql и сохраняет в общий файл настроек.
I Я использую класс провайдера, чтобы получить доступ к уведомителю об изменениях, потому что мне нужно немедленно уведомить другие страницы, как только общие настройки будут обновлены с использованием информации вошедшего в систему пользователя.
После входа в систему я хотел бы всплывающее окно для автоматического закрытия. К сожалению, код, который я пытаюсь использовать, не работает - под словом «контекст» есть красная линия. Предположительно, это потому, что всплывающее окно вызывается с другой страницы.
Navigator.pop(context);
Что я могу указать для «контекста»? Или есть другой способ заставить это всплывающее окно автоматически закрываться сразу после входа пользователя в систему?
Вот код;
class SocialProvider with ChangeNotifier {
final SocialLogin socialLogin = SocialLogin();
static const GOOGLE_WEB_CLIENT_ID = "xxx.apps.googleusercontent.com";
SocialUser currentUser;
String currentname;
String currentavatar;
String currentemail;
bool currentlogged;
void socState() {
socialLogin.setConfig(SocialConfig(
googleWebClientId: GOOGLE_WEB_CLIENT_ID,
));
}
Future<void> logInGoogle() async {
try {
socState();
currentUser = await socialLogin.logInGoogle();
currentavatar = currentUser.pictureUrl;
currentname = currentUser.name;
currentemail = currentUser.email;
currentlogged = true;
postSocialData(currentUser.name, currentUser.email, currentavatar);
savePreferences(
currentname: currentUser.name,
currentemail: currentUser.email,
currentlogged: true,
);
Navigator.pop(context);
} catch (e) {
print(e);
}
}
savePreferences({String currentname, String currentavatar, String currentemail, bool currentlogged}) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('currentname', currentname);
prefs.setString('currentavatar', currentavatar);
prefs.setString('currentemail', currentemail);
prefs.setBool('currentlogged', currentlogged);
notifyListeners();
}
loadPreferences() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String currentname = prefs.getString('currentname');
String currentavatar = prefs.getString('currentavatar');
String currentemail = prefs.getString('currentemail');
bool currentlogged = prefs.getBool('currentlogged');
notifyListeners();
}
showPopup(BuildContext context, Widget widget, String title,
{BuildContext popupContext}) {
Navigator.push(
context,
PopupLayout(
top: 30,
left: 30,
right: 30,
bottom: 50,
child: PopupContent(
content: Scaffold(
resizeToAvoidBottomPadding: false,
body: widget,
),
),
),
);
}
Widget popupBody() {
return MaterialApp(
home: Scaffold(
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RaisedButton(
textColor: Colors.white,
color: Colors.indigoAccent,
onPressed: logInGoogle,
child: Text('Log in with Google'),
)
],
),
),
],
),
),
);
}
}
И вот где всплывающее окно вызывается изнутри сборка Stateful Widget;
child: new FlatButton(
onPressed: () {
socialProvider.loadPreferences();
if (socialProvider.currentlogged != true) {
socialProvider.showPopup(context, socialProvider.popupBody(), 'Cancel Login');
} else {
switch (_currentStatus) {
case RecordingStatus.Initialized:
{
_start();
break;
}
case RecordingStatus.Recording:
{
_pause();
break;
}
case RecordingStatus.Paused:
{
_resume();
break;
}
case RecordingStatus.Stopped:
{
_init();
break;
}
default:
break;
}
}//switch end
},
child: Padding(
padding: const EdgeInsets.all(5.0),
child: _buildText(_currentStatus),
),
color: Color(0xffb79eb5).withOpacity(.75),
),