按钮onPressed具有2 setState的异步方法

时间:2020-04-30 17:14:19

标签: flutter dart

我不知道为什么异步onPressed方法中的2 setState会导致错误

未处理的异常:在dispose()之后调用setState(): _LoginScreenState#0eb2c(生命周期状态:已终止,未安装)

这是我的代码

 RaisedButton(
      child: Text('Login'),
      onPressed: emailController.text == "" || passwordController.text == ""
          ? null
          : () async {
              setState(() {
                _isLoading = true;
              });
              SharedPreferences prefs =
                  await SharedPreferences.getInstance();
              prefs.setString('email', emailController.text);
              try {
                await Provider.of<Auth>(context, listen: false)
                    .signIn(emailController.text, passwordController.text);
              } on HttpException catch (error) {
                exceptionAlertDialog(context, error.toString());
              } catch (error) {
                exceptionAlertDialog(context, error.toString());
              }
              setState(() {
                _isLoading = false;
              });
            },
    )

一旦isLoading为true,我将显示微调器。。没什么特别的

body: Container(
        alignment: Alignment.center,
        child: _isLoading
            ? Center(child: CircularProgressIndicator())
            : ListView(
                children: <Widget>[textSection(), buttonSection()],
              ),
      ),

如果我在onPressed按钮中注释掉了这2种设置状态,则一切正常。

1 个答案:

答案 0 :(得分:1)

尝试放置isLoading进行处理

  @override
  void dispose() {
    _isLoading = false;
    super.dispose();
  }