Всплывающий виджет Flutter в провайдере - в каком контексте он закрывается? - PullRequest
0 голосов
/ 13 июля 2020

У меня есть класс 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),
             ),

1 Ответ

0 голосов
/ 14 июля 2020

Итак, вот что я сделал в итоге:

Future<void> logInGoogle(BuildContext context) async {
    try {
      socState();
      currentUser = await socialLogin.logInGoogle();
  
  currentname = currentUser.name;
  currentavatar = currentUser.pictureurl; 
  currentemail = currentUser.email;
  currentlogged = true;
  postSocialData(currentUser.name, currentUser.email, currentavatar);

  savePreferences(
    currentname: currentUser.name,
    currentavatar: currentUser.pictureUrl,
    currentemail: currentUser.email,
    currentlogged: true,
  );
  Navigator.pop(context);
} catch (e) {
  print(e);
}

}

А для всплывающего кода:

showPopup(BuildContext context, Widget widget, String title,
      {BuildContext popupContext}) {
    Navigator.push(
      context,
      PopupLayout(
        top: 100,
        left: 60,
        right: 60,
        bottom: 100,
        child: PopupContent(
          content: Scaffold(
            resizeToAvoidBottomPadding: false,
            body: widget,
          ),
        ),
      ),
    );
  }



   Widget popupBody(context) {
    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(context),
                    child: Text('Log in with Google'),
                  )
        ],
      ),
    ),
   
    ],
  ),
  ),
    );
   }
...