java - CircularProgressIndicator 只显示一次
问题描述
我希望每次用户单击登录按钮以显示 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()
],
));
}),
);
}
}
解决方案
如果您使用的是 bloc,那么您还应该有一个类来保存状态。当您单击按钮创建登录事件时,根据您的 api 响应更新 bloc 的状态。
推荐阅读
- kubernetes - 我可以在没有 virtualBox 的情况下在 ubuntu 上安装 minikube 吗?
- url - HAProxy http-request 将特定路径重定向到另一个路径
- android - Retrofit2:保护baseUrl
- python - 从熊猫系列中删除最小值
- python - Python 3 Tkinter:弹出窗口不显示
- android - 滑动和图像分辨率
- r - R- 列匹配,创建具有对应值的另一列的新列
- powershell - PowerShell脚本文件中的Get-History
- amazon-web-services - 在 aws-cdk 中操作 CfnParameter 字符串的最佳方法
- r - 我正在尝试在每个数据帧中为多个文件查找非 na 观察值的数量