Flutter setState不更新小部件

时间:2019-09-10 19:52:12

标签: flutter dart

我对开发人员尝试抖动感到反应。

我有如下状态的小部件

// progress_indicators: ^0.1.2
import 'package:progress_indicators/progress_indicators.dart';

class Login extends StatefulWidget {
  @override
  _LoginState createState() => _LoginState();
}

class _LoginState extends State<Login> {
  var _isLoading = false;

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

  @overide 
  Widget build(BuildContext context) {
    body: Container(
      child: Column(
        children: <Widget>[
          Form(),
          _isLoading ? JumpingDotsProgressIndicator(
              fontSize: 60.0,
           ): Padding(padding: EdgeInsets.only(top:0))
        ]
      )
    )
  }

  onLogin() async {
    final response = await loginUser(_userController.text.trim(), _passController.text.trim());
    setState(() { _isLoading = true; });
    if(response == true) {
      print("User Logging take them to activity");
    } else {
      setState(() { _isLoading = false; });
      bottomModel(response['message']);
    }
  }
}

JumpingDotsProgressIndicatorprogress_indicators中的一种方法,为我提供了一个简单的加载程序。

我想在loginUser方法执行过程中显示加载程序。 loginUser是到我的NodeJS服务器的简单请求。

当单击位于onLogin中的按钮时,也会调用Form()。 一切正常,但是即使我设置了状态,加载程序也没有显示。

条件渲染在做什么?

我还有一个问题

_isLoading ? JumpingDotsProgressIndicator(
  fontSize: 60.0,
): Padding(padding: EdgeInsets.only(top:0))

在这里,我给0填充,就像一个空窗口小部件,因此我也尝试添加null代替Padding(padding: EdgeInsets.only(top:0)),然后在模拟器中显示Assertion failed

有人能解释一下原因吗?

感谢adv!

1 个答案:

答案 0 :(得分:1)

您好尝试从setState(() { _isLoading = false; });中删除initState(),否则每次小部件由于状态更改而构建新的东西时,它将_isLoading设置为false,甚至无法看到预期的行为。简而言之,您的状态永远不会正确。