Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android “onPressed”中的FutureBuilder不会更新UI_Android_Ios_Flutter_Mobile_Flutter Layout - Fatal编程技术网

Android “onPressed”中的FutureBuilder不会更新UI

Android “onPressed”中的FutureBuilder不会更新UI,android,ios,flutter,mobile,flutter-layout,Android,Ios,Flutter,Mobile,Flutter Layout,我正在开发一个与颤振登录表单。当用户单击submit按钮时,它将连接到Firebase Auth以查看凭据并登录用户。在此过程之前,我需要向用户显示一个CircularProgressBar。要查看登录过程是否完成,我正在使用FutureBuilder。下面是我的代码 final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>(); class LoginPage extends

我正在开发一个与颤振登录表单。当用户单击
submit
按钮时,它将连接到Firebase Auth以查看凭据并登录用户。在此过程之前,我需要向用户显示一个
CircularProgressBar
。要查看登录过程是否完成,我正在使用
FutureBuilder
。下面是我的代码

final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();

class LoginPage extends StatelessWidget {
  LoginPage() {}

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,
      body: Container(
          decoration: BoxDecoration(
              gradient: LinearGradient(
                  begin: Alignment.topCenter,
                  end: Alignment.bottomCenter,
                  colors: [
                Color.fromRGBO(11, 51, 83, 90),
                Color.fromRGBO(4, 18, 30, 1)
              ])),
          child: LoginForm()),
    );
  }
}

class LoginForm extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return LoginFormState();
  }
}

class LoginFormState extends State<LoginForm> {
  final _formKey = GlobalKey<FormState>();
  final FirebaseAuth _auth = FirebaseAuth.instance;

  TextEditingController emailController = TextEditingController();
  TextEditingController passwordController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return ListView(
      children: <Widget>[
        Container(
          child: _buildLogo(),
          margin:
              EdgeInsets.only(top: MediaQuery.of(context).size.height * 0.20),
        ),
        Container(
          child: _buildForm(),
          margin: EdgeInsets.only(left: 10, right: 10, top: 83),
        )
      ],
    );
  }

  Widget _buildLogo() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Image.asset(
          "assets/images/logo.png",
          fit: BoxFit.fill,
        )
      ],
    );
  }

  Widget _buildForm() {
    return Form(
      key: _formKey,
      child: Column(
        children: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Flexible(
                flex: 1,
                child: Container(
                    child: Icon(
                      Icons.person,
                      color: Colors.white,
                    ),
                    // child: ImageIcon(
                    //   AssetImage("assets/images/email_24px.png"),
                    //   color: Colors.white,
                    // ),
                    margin: EdgeInsets.only(right: 5, bottom: 10)),
              ),
              Flexible(
                  flex: 7,
                  child: SizedBox(
                    height: 60,
                    child: TextFormField(
                      controller: emailController,
                      validator: (value) {
                        if (value.isEmpty) {
                          return 'Please enter some text';
                        }
                        return null;
                      },
                      decoration: InputDecoration(
                        filled: true,
                        fillColor: Colors.white,
                        contentPadding:
                            const EdgeInsets.only(top: 2, bottom: 2, left: 8),
                        border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(30.0),
                        ),
                        hintText: "Email",
                      ),
                    ),
                  ))
            ],
          ),
          Container(
            margin: EdgeInsets.only(top: 25),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Flexible(
                  flex: 1,
                  child: Container(
                    child: Icon(Icons.lock, color: Colors.white),
                    margin: EdgeInsets.only(right: 5, bottom: 10),
                  ),
                ),
                Flexible(
                    flex: 7,
                    child: SizedBox(
                      height: 60,
                      child: TextFormField(
                        controller: passwordController,
                        validator: (value) {
                          if (value.isEmpty) {
                            return 'Please enter some text';
                          }
                          return null;
                        },
                        decoration: InputDecoration(
                          filled: true,
                          fillColor: Colors.white,
                          contentPadding:
                              const EdgeInsets.only(top: 2, bottom: 2, left: 8),
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(30.0),
                          ),
                          hintText: "Password",
                        ),
                      ),
                    ))
              ],
            ),
          ),
          Container(
            child: Row(
              mainAxisAlignment: MainAxisAlignment.end,
              children: <Widget>[
                FlatButton(
                  materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
                  child: Text(
                    "Forgot Password?",
                    style: Theme.of(context).textTheme.body1,
                  ),
                  onPressed: () {},
                ),
              ],
            ),
          ),
          Container(
            margin: EdgeInsets.only(top: 40, left: 25, right: 10, bottom: 20),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Flexible(
                    child: SizedBox(
                  width: double.infinity,
                  height: 40,
                  child: RaisedButton(
                    color: Color.fromRGBO(0, 72, 128, 100),
                    textColor: Colors.white,
                    shape: RoundedRectangleBorder(
                        borderRadius: new BorderRadius.circular(18.0),
                        side:
                            BorderSide(color: Color.fromRGBO(0, 72, 128, 100))),
                    child: Text(
                      "LOGIN",
                      style: Theme.of(context).textTheme.button,
                    ),
                    onPressed: () {
                      if (_formKey.currentState.validate()) {
                        FutureBuilder(
                          future:
                              Provider.of<AuthService>(context, listen: false)
                                  .signInWithEmail(emailController.text,
                                      passwordController.text),
                          builder:
                              (BuildContext context, AsyncSnapshot snapshot) {
                            if (snapshot.connectionState == ConnectionState.done) {
                              Navigator.pushNamed(context, "/home");
                            } else {
                              _scaffoldKey.currentState.showSnackBar(SnackBar(
                                duration: Duration(seconds: 4),
                                content: Row(
                                  children: <Widget>[
                                    new CircularProgressIndicator(),
                                    new Text("  Signing-In...")
                                  ],
                                ),
                              ));
                            }
                          },
                        );
                        // signInWithEmail("test@test.com","test123");
                      }
                    },
                  ),
                ))
              ],
            ),
          )
        ],
      ),
    );
  }

  Future<String> signInWithEmail(String email, String password) async {
    FirebaseUser user;

    try {
      AuthResult result = await _auth.signInWithEmailAndPassword(
          email: email, password: password);
      user = result.user;

      if (user != null) {
        print("SIgn in success: " + user.email);
      } else {
        print("sign in failed");
      }
    } catch (e) {
      print(e.toString());
    }
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
  }

  @override
  void dispose() {
    emailController.dispose();
    passwordController.dispose();

    super.dispose();
  }
}
final GlobalKey _scaffoldKey=new GlobalKey();
类LoginPage扩展了无状态小部件{
LoginPage(){}
@凌驾
小部件构建(构建上下文){
返回脚手架(
钥匙:_scaffoldKey,
主体:容器(
装饰:盒子装饰(
梯度:线性梯度(
开始:Alignment.topCenter,
结束:对齐。底部中心,
颜色:[
颜色。来自RGBO(11,51,83,90),
颜色。来自RGBO(4,18,30,1)
])),
子项:LoginForm()),
);
}
}
类LoginForm扩展StatefulWidget{
@凌驾
状态createState(){
//TODO:实现createState
返回LoginFormState();
}
}
类LoginFormState扩展了状态{
final _formKey=GlobalKey();
final FirebaseAuth _auth=FirebaseAuth.instance;
TextEditingController emailController=TextEditingController();
TextEditingController密码控制器=TextEditingController();
@凌驾
小部件构建(构建上下文){
//TODO:实现构建
返回列表视图(
儿童:[
容器(
子项:_buildLogo(),
保证金:
仅限EdgeInsets.only(顶部:MediaQuery.of(context).size.height*0.20),
),
容器(
子项:_buildForm(),
页边距:仅限边集(左:10,右:10,顶:83),
)
],
);
}
Widget_buildLogo(){
返回行(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
影像资产(
“assets/images/logo.png”,
fit:BoxFit.fill,
)
],
);
}
小部件_buildForm(){
报税表(
键:_formKey,
子:列(
儿童:[
划船(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
灵活的(
弹性:1,
子:容器(
子:图标(
一个人,
颜色:颜色,白色,
),
//子:图像图标(
//资产估值(“资产/图像/电子邮件_24px.png”),
//颜色:颜色,白色,
// ),
页边距:仅限边集(右:5,下:10)),
),
灵活的(
弹性:7,
孩子:大小盒子(
身高:60,
子项:TextFormField(
控制器:emailController,
验证器:(值){
if(value.isEmpty){
返回“请输入一些文本”;
}
返回null;
},
装饰:输入装饰(
是的,
fillColor:Colors.white,
内容填充:
仅限常数边集(顶部:2,底部:2,左侧:8),
边框:大纲输入边框(
边界半径:边界半径。圆形(30.0),
),
hintText:“电子邮件”,
),
),
))
],
),
容器(
页边距:仅限边缘集(顶部:25),
孩子:排(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
灵活的(
弹性:1,
子:容器(
子:图标(Icons.lock,color:Colors.white),
页边距:仅限边集(右侧:5,底部:10),
),
),
灵活的(
弹性:7,
孩子:大小盒子(
身高:60,
子项:TextFormField(
控制器:密码控制器,
验证器:(值){
if(value.isEmpty){
返回“请输入一些文本”;
}
返回null;
},
装饰:输入装饰(
是的,
fillColor:Colors.white,
内容填充:
仅限常数边集(顶部:2,底部:2,左侧:8),
边框:大纲输入边框(
边界半径:边界半径。圆形(30.0),
),
hintText:“密码”,
),
),
))
],
),
),
容器(
孩子:排(
mainAxisAlignment:mainAxisAlignment.end,
儿童:[
扁平按钮(
MaterialTargetSize:MaterialTargetSize.shrinkWrap,
子:文本(
“忘记密码了?”,
样式:Theme.of(context).textTheme.body1,
),
按下:(){},
),
],
),
),
容器(
页边空白:仅限边集(顶部:40,左侧:25,右侧:10,底部:20),
孩子:排(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
灵活的(
儿童:Si
                        FutureBuilder(
                          future:
                              Provider.of<AuthService>(context, listen: false)
                                  .signInWithEmail(emailController.text,
                                      passwordController.text),
                          builder:
                              (BuildContext context, AsyncSnapshot snapshot) {
                            if (snapshot.connectionState == ConnectionState.done) {
                              Navigator.pushNamed(context, "/home");
                            } else {
                              _scaffoldKey.currentState.showSnackBar(SnackBar(
                                duration: Duration(seconds: 4),
                                content: Row(
                                  children: <Widget>[
                                    new CircularProgressIndicator(),
                                    new Text("  Signing-In...")
                                  ],
                                ),
                              ));
                            }
                            return  new CircularProgressIndicator();
                          },
                        );