CircularProgressIndicator 只显示一次

Posted

技术标签:

【中文标题】CircularProgressIndicator 只显示一次【英文标题】:CircularProgressIndicator only shows one time 【发布时间】:2021-12-23 00:46:01 【问题描述】:

我希望每次用户单击登录按钮以显示 CircularProgressIndicator 而不是按钮,同时从 API 获取数据并在获取完成后,再次显示登录按钮或转到基于主页在获取的数据上。但它只显示第一次,下次点击它不显示,它只显示按钮!

这是我的代码:

import 'package:flutter/material.dart';
import 'package:news/src/blocs/latest_news_provider.dart';

import 'home_screen.dart';

class Chart extends StatefulWidget 
  @override
  _State createState() => _State();


class _State extends State<Chart> 
  TextEditingController nameController = TextEditingController();
  TextEditingController passwordController = TextEditingController();
  bool hasErr = false;
  late String errTxt;
  bool isButtonPressed = false;

  @override
  Widget build(BuildContext context) 
    final bloc = LatestNewsProvider.of(context);
    return Scaffold(
      appBar: AppBar(
        title: Text('Crypto'),
        backgroundColor: Colors.purple[700],
      ),
      body: StreamBuilder(
          stream: bloc.loginStream,
          builder: (BuildContext context, AsyncSnapshot snapshot) 
            if (snapshot.hasData) 
              isButtonPressed = false;
              WidgetsBinding.instance!.addPostFrameCallback((_) 
                Navigator.pushReplacement(
                    context, MaterialPageRoute(builder: (_) => HomeScreen()));
              );
             else if (snapshot.hasError) 
              isButtonPressed = false;
              hasErr = true;
              errTxt = snapshot.error.toString();
            
            return Padding(
                padding: EdgeInsets.all(10),
                child: ListView(
                  children: <Widget>[
                    Container(
                        alignment: Alignment.center,
                        padding: EdgeInsets.all(10),
                        child: Text(
                          'Nobitex',
                          style: TextStyle(
                              color: Colors.purple[700],
                              fontWeight: FontWeight.w500,
                              fontSize: 30),
                        )),
                    Container(
                      padding: EdgeInsets.all(10),
                      child: TextField(
                        controller: nameController,
                        decoration: InputDecoration(
                          border: OutlineInputBorder(),
                          labelText: 'Username',
                        ),
                      ),
                    ),
                    Container(
                      padding: EdgeInsets.fromLTRB(10, 10, 10, 0),
                      child: TextField(
                        obscureText: true,
                        controller: passwordController,
                        decoration: InputDecoration(
                          border: OutlineInputBorder(),
                          labelText: 'Password',
                        ),
                      ),
                    ),
                    SizedBox(
                      height: 10,
                    ),
                    isButtonPressed
                        ? Center(
                            child: CircularProgressIndicator(
                            color: Colors.purple[700],
                          ))
                        : Container(
                            height: 50,
                            padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
                            child: ElevatedButton(
                              style: ElevatedButton.styleFrom(
                                  primary: Colors.purple[700]),
                              child: Text('Login'),
                              onPressed: () 
                                setState(() 
                                  isButtonPressed = true;
                                  hasErr = false;
                                );
                                bloc.login(nameController.text,
                                    passwordController.text);
                              ,
                            )),
                    hasErr == true
                        ? Container(
                            margin: EdgeInsets.only(top: 10),
                            child: Center(
                                child: Text(
                              errTxt.toString(),
                              style: TextStyle(
                                color: Colors.red,
                                fontWeight: FontWeight.bold,
                              ),
                            )))
                        : Container()
                  ],
                ));
          ),
    );
  

【问题讨论】:

【参考方案1】:

如果您使用 bloc,那么您还应该有一个类来保存状态。当您单击按钮创建登录事件时,根据您的 api 响应更新 bloc 的状态。

【讨论】:

以上是关于CircularProgressIndicator 只显示一次的主要内容,如果未能解决你的问题,请参考以下文章

API 调用完成后显示 CircularProgressIndicator() 不会停止

更改 CircularProgressIndicator 和 LinearProgressIndicator 的颜色

CircularProgressIndicator 只显示一次

如何将大小设置为 CircularProgressIndicator?

使用 Theme 小部件设置 CircularProgressIndicator 的 backgroundColor

Flutter - 在对话框窗口中更改 CircularProgressIndicator 的大小