Как спрятать кнопку при нажатии в флаттере? - PullRequest
0 голосов
/ 01 апреля 2020

обычное изображение

изображение после ввода номера мобильного телефона

Смотрите на этом изображении, когда пользователь нажимает кнопку входа в систему кнопку входа в систему должно исчезнуть, и текстовое поле будет там, а затем кнопка отправки.

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

import 'dart:async';
import 'dart:ffi';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import '../widgets/landing_page.dart';
import '../screens/register.dart';
import 'package:google_sign_in/google_sign_in.dart';
import '../widgets/google_sign_in_btn.dart';
import '../widgets/reactive_refresh_indicator.dart';

// Each item on AuthStatus represents quite literally the status of the UI.
// On SOCIAL_AUTH only the GoogleSignInButton will be visible.
enum AuthStatus { SOCIAL_AUTH }

class AuthScreen extends StatefulWidget {
  @override
  _AuthScreenState createState() => _AuthScreenState();
}

// On _AuthScreenState we start by defining the tag that will be used for our logger, then the default status as SOCIAL_AUTH, which means we need to do Google's sign in and the GoogleSignInButton will be visible and interactive.
class _AuthScreenState extends State<AuthScreen> {
  String phoneNo;
  String smsCode;
  String verificationId;
  bool _smsCodeDisabled = true;
  bool isThere;
  bool isPresent;
  bool _canShowButton = false;

  final db = Firestore.instance;
 Firestore.instance.collection('transcriber_user_registeration').where('mobileno', isEqualTo: phoneNo)
  // .snapshots().listen(
  //       (data) { print("Inside phone number check : $data"); });
  //       // return phoneNumberCheck(phoneNo);

  // QuerySnapshot result =
  //       await Firestore.instance.collection('transcriber_user_registeration').getDocuments();
  //  var list = result.documents;
  // print("Before data loop");
  // list.forEach((data) => print(data));
  // print("After data loop");

  Future<void> phoneNumberCheck(String phoneNo) async {
    print("Start of the function");
    //bool registerState = false;
    //bool isPresent = false;
    Firestore.instance
        .collection("transcriber_user_registeration")
        .getDocuments()
        .then((QuerySnapshot snapshot) {
      snapshot.documents.forEach((f) async {
        if (isPresent = ('${f.data['mobileno']}' == phoneNo)) {
          print(isPresent);
          final PhoneCodeAutoRetrievalTimeout autoRetrieve = (String verId) {
            this.verificationId = verId;
          };
          final PhoneCodeSent smsCodeSent =
              (String verId, [int forceCodeResend]) {
            this.verificationId = verId;
            print("im in sms code dialog");
//          smsCodeDialog(context).then((value) {
//          print('Signed in');
//          });
            setState(() {
              this._smsCodeDisabled = false;
            });
          };
          final PhoneVerificationCompleted verifySuccess =
              (AuthCredential user) {
            print("verified");
          };

          final PhoneVerificationFailed verifyFailed =
              (AuthException exception) {
            print('${exception.message}');
          };

          await FirebaseAuth.instance.verifyPhoneNumber(
            phoneNumber: this.phoneNo,
            codeAutoRetrievalTimeout: autoRetrieve,
            codeSent: smsCodeSent,
            timeout: const Duration(seconds: 5),
            verificationCompleted: verifySuccess,
            verificationFailed: verifyFailed,
          );
        }
//        else {
//          _showMessage();
//        }
      });
    });
    //print("End of the function $isPresent");
  }

  Future<void> verifyPhone() async {
    // final PhoneCodeAutoRetrievalTimeout autoRetrieve = (String verId) {
    //   this.verificationId = verId;
    // };
    var tmp1 = phoneNo.toString();
    print('ref stsmt starts $tmp1');
    await phoneNumberCheck(phoneNo);
    print("After execution of the function $isPresent");
    print('bvnnn');

  }

  Future<bool> smsCodeDialog(BuildContext context) {
    return showDialog(
        context: context,
        barrierDismissible: false,
        builder: (BuildContext context) {
          return new AlertDialog(
            title: Text('Enter sms code'),
            content: TextField(onChanged: (value) {
              this.smsCode = value;
            }),
            contentPadding: EdgeInsets.all(10.0),
            actions: <Widget>[
              new FlatButton(
                  child: Text('Login'),
                  onPressed: () async {
                    //await signIn();
                    await FirebaseAuth.instance.currentUser().then((user) {
//                      Navigator.push(
//                          context,
//                          MaterialPageRoute(
//                              builder: (context) => LandingPageApp()));
                    });
                  })
            ],
          );
        });
  }

  signIn() {
    print("came to sign in page");
    final AuthCredential credential = PhoneAuthProvider.getCredential(
      verificationId: verificationId,
      smsCode: smsCode,
    );

    FirebaseAuth.instance.signInWithCredential(credential).then((user) {
      Navigator.push(
          context, MaterialPageRoute(builder: (context) => LandingPageApp()));
    }).catchError((e) {
      print(e);
    });
  }

  void hideWidget() {
    setState(() {
      _canShowButton != _canShowButton;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Colors.white,
        body: Container(
          color: Colors.white,
          child: Column(
            mainAxisSize: MainAxisSize.min,
            mainAxisAlignment: MainAxisAlignment.start,
            children: <Widget>[
              Flexible(
                flex: 1,
                child: new Container(
                  //color: Colors.white,
                  height: 200.0,
                  width: 400.0,
                  decoration: new BoxDecoration(
                    image: DecorationImage(
                      image: new AssetImage('assets/images/download.png'),
                    ),
                  ),
                ),
              ),
              SizedBox(height: 20.0),
              Padding(
                padding: EdgeInsets.symmetric(vertical: 16.0, horizontal: 20.0),
                child: TextFormField(
                    decoration:
                    InputDecoration(hintText: 'Enter your Phone number'),
                    keyboardType: TextInputType.phone,
                    onChanged: (value) {
                      this.phoneNo = "+91$value";
                    },
                    validator: validateMobile),
              ),
              SizedBox(height: 10.0),
              Visibility(
                visible: _canShowButton,
                child: RaisedButton(
                  child: Text('Login'),
                  textColor: Colors.white,
                  elevation: 7.0,
                  color: Colors.blue,
                  onPressed: () async {
                    bool _canShowButton = true;
                    await verifyPhone();
                    setState(() {
                      _canShowButton = !_canShowButton;
                    });
                    hideWidget();
                    //_number();
                  },
                ),
              ),
              _smsCodeDisabled
                  ? SizedBox(height: 10.0)
                  : Column(
                mainAxisAlignment: MainAxisAlignment.start,
                children: <Widget>[
                  Padding(
                    padding: EdgeInsets.symmetric(
                        horizontal: 20.0, vertical: 16.0),
                    child: TextFormField(
                        decoration:
                        InputDecoration(hintText: 'Enter OTP'),
                        keyboardType: TextInputType.number,
                        onChanged: (value) {
                          this.smsCode = value;
                        },
                        validator: validateOtp),
                  ),
                  SizedBox(height: 10.0),
                  RaisedButton(
                    onPressed: () async {
                      await signIn();
                      FirebaseAuth.instance.currentUser().then((user) {
                        print(["user", user]);
                        if (user != null) {
                          print(user.uid);
//                                Navigator.of(context).pop();
////                                    Navigator.of(context).pushReplacementNamed('/homePage');
//                                Navigator.of(context).push(
//                                    MaterialPageRoute<Null>(
//                                        builder: (BuildContext context) {
//                                  return new LandingPageApp();
//                                }));
                        } else {
                          print("user is null");
                          Navigator.of(context).pop();
                          signIn();
                        }
                      });
                    },
                    child: Text('Submit'),
                    textColor: Colors.white,
                    elevation: 7.0,
                    color: Colors.blue,
                  ),
                ],
              ),
              SizedBox(
                height: 20.0,
              ),
              Column(
                children: <Widget>[
                  Row(children: <Widget>[
                    Padding(
                      padding: EdgeInsets.symmetric(
                          vertical: 16.0, horizontal: 20.0),
                      child: Text(
                        'Not a Registered User?',
                        style: TextStyle(
                          fontSize: 16,
                        ),
                      ),
                    ),
                    MaterialButton(
                      child: Text(
                        'Register',
                        style: TextStyle(
                          color: Colors.black,
                        ),
                      ),
                      //color: Colors.blue,
                      onPressed: () {
                        Navigator.push(
                            context,
                            MaterialPageRoute(
                                builder: (context) => Register()));
                      },
                    ),
                  ]),
                ],
              ),
            ],
          ),
        ));
  }
}

String validateMobile(String value) {
  //Indian Mobile numbers are of 10 digits only.
  if (value.length != 10)
    return 'Mobile number must be of 10 digits';
  else
    return null;
}

String validateOtp(String value) {
  //Otp needs to be of 6 digits
  if (value.length != 6)
    return 'OTP must be of 6 digits';
  else
    return null;
}

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Пожалуйста, попробуйте это

  bool _canShowButton = true;

  void hideWidget() {
    setState(() {
      _canShowButton = !_canShowButton;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Test Screen'),
      ),
      body: Container(
          padding: const EdgeInsets.all(8),
          child: Column(
            children: <Widget>[
              Flexible(
                flex: 1,
                child: Container(
                  //color: Colors.white,
                  height: 200.0,
                  width: 400.0,
                  decoration: BoxDecoration(
                    image: DecorationImage(
                      image: AssetImage('https://picsum.photos/250?image=10'),
                    ),
                  ),
                ),
              ),
              SizedBox(height: 20.0),
              ///if the show button is false
              !_canShowButton
                  ? const SizedBox.shrink()
                  : RaisedButton(
                      child: Text('Login'),
                      textColor: Colors.white,
                      elevation: 7.0,
                      color: Colors.blue,
                      onPressed: () {
                        hideWidget();
                        //_number();
                      },
                    ),
            ],
          )),
    );
  }
0 голосов
/ 01 апреля 2020

В вашем методе сборки у вас уже есть логическое значение _smsCodeDisabled, чтобы определить, нужно ли показывать поле otp или нет. Вы можете использовать то же логическое значение, чтобы скрыть поле и кнопку входа в систему. Лог c должен выглядеть примерно так:

@override
Widget build(BuildContext context) { 
    return _smsCodeDisabled ? _getLoginWidget() : _getOtpWidget();
}

Widget _getLoginWidget() {
   // Return Login field and button
}

Widget _getOtpWidget() {
  // Return otp field and button
}

Или Если вам нужно только скрыть кнопку входа в систему, используйте следующие логики c:

@override
Widget build(BuildContext context) { 
    return Scaffold(
       // other code
       // Login button logic
      _smsCodeDisabled ? RaisedButton(...) : Container();
    );
}
...