Как напрямую выполнить метод login () вместо переопределения метода сборки и возврата виджета на AccountKit - PullRequest
0 голосов
/ 03 апреля 2019

Я настраиваю AccountKit на базовом шаблоне приложения, над которым я работаю. Пример, который я использовал, предоставлен плагином AccountKit для Flutter .

Теперь, это работает отлично до сих пор.

Что я делаю, так это использую OnTap на экране входа в систему, чтобы перевести пользователя в пример реализации плагина (account-kit.dart в моем файле).

onTap: () {
        Navigator.of(context).push(
//          MaterialPageRoute(builder: (context) => MessagesScreen()),
          MaterialPageRoute(builder: (context) => AccountKit()),
        );
      },

Затем на странице account-kit.dart генерируется виджет, в котором есть кнопка, которую необходимо нажать, чтобы выполнить метод Future<void> login() async{...}.

Это создает проблему, из-за которой мои пользователи теперь видят ненужный экран между переходом от моего логина к флаттеру. Это так:

  1. Мой экран входа в систему
  2. Пример экрана входа в приложение
  3. AccountKit Логин (обязательно)
  4. Вернуться к примеру экрана входа приложения
  5. Навигация на экран сообщений ()

Это немного неуклюже, поэтому я с нетерпением жду полного избавления от шага 2 и шага 4.

Так что это будет означать, что я нажму кнопку login на LoginScreen(). Затем перейдите к методу loginkit.dart в методе login (), и он будет выполнен, и он напрямую приведет меня к MessagesScreen().

Но, если я ничего не верну на Widget build(BuildContext context) {} и только выполню login() внутри, я столкнусь с ошибками.

Итак, как лучше всего избавиться от этих ненужных элементов на этом экране?

@override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        body: new Center(
          child: RaisedButton(
            padding: EdgeInsets.all(0.0),
            color: _state == 2 ? Colors.green : Colors.blue,
            elevation: 2.0,
            splashColor: Colors.blueGrey,
            child: buildButtonChild(),
            onPressed: _isInitialized ? this.login : null,
          ),
        ),
      ),
    );
  }

  Widget buildButtonChild() {
    if (_state == 0) {
      return Text(
        'Login',
        style: TextStyle(color: Colors.white, fontSize: 16.0),
      );
    } else if (_state == 1) {
      return SizedBox(
          height: 24.0,
          width: 24.0,
          child: CircularProgressIndicator(
            value: null,
            valueColor: AlwaysStoppedAnimation<Color>(Colors.white),
          ));
    } else {
      return Icon(Icons.check, color: Colors.white);
    }
  }

Вы можете найти полный код соответствующих трех страниц вниз по адресу ЭТО GIT GIST .

На изображении ниже показаны ненужные загружаемые экраны. Я просто хочу, чтобы они не появлялись (2-й и 3-й экран с дополнительной кнопкой входа в систему).

enter image description here

1 Ответ

1 голос
/ 03 апреля 2019

это функция, которая запускает accountkit

Future<void> initAccountkit() async {
    print('Init account kit called');
    bool initialized = false;
    // Platform messages may fail, so we use a try/catch PlatformException.
    try {
      final theme = AccountKitTheme(
          headerBackgroundColor: Colors.green,
          buttonBackgroundColor: Colors.yellow,
          buttonBorderColor: Colors.yellow,
          buttonTextColor: Colors.black87);
      await akt.configure(Config()
        ..facebookNotificationsEnabled = true
        ..receiveSMS = true
        ..readPhoneStateEnabled = true
        ..theme = theme
        );
      initialized = true;
    } on PlatformException {
      print('Failed to initialize account kit');
    }

, теперь вы нажали для кнопки входа в систему, вызовите эту функцию

  Future loginNow() async {
           //here you can call the function and handle the output(return value) as result
           initAccountkit().then((result) {
               // print(result);

                //call login function of accountKit below

          });
     }



 Future<void> login() async {
    if (_state == 1) {
      return;
    }
    setState(() {
      _state = 1;
    });
    final result = await akt.logInWithPhone();
    if (result.status == LoginStatus.cancelledByUser) {
      print('Login cancelled by user');
      setState(() {
        _state = 0;
      });
    } else if (result.status == LoginStatus.error) {
      print('Login error');
      setState(() {
        _state = 0;
      });
    } else {
      print('Login success');
      setState(() {
        _state = 2;
      });
    }
  }
...