作者:yanbin0220_252 | 来源:互联网 | 2023-09-04 12:55
我正在尝试使用dio&BLoC模式调用API时显示CircularProgressIndicator
。
这是代码:
class UserWidget extends StatefulWidget {
@override
State createState() {
return _UserWidgetState();
}
}
class _UserWidgetState extends State {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
margin: EdgeInsets.only(top: 200),child: RaisedButton(
child: Text("Click"),onpressed: () {
bloc.getUser();
StreamBuilder(
stream: bloc.subject.stream,builder: (context,Asyncsnapshot snapshot) {
if (snapshot.hasData) {
return _buildUserWidget(snapshot.data);
} else if (snapshot.hasError) {
return _buildErrorWidget(snapshot.error);
} else {
return _buildLoadingWidget();
}
},);
},),);
}
Widget _buildLoadingWidget() {
return Center(
child: CircularProgressIndicator(),);
}
Widget _buildErrorWidget(String error) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,children: [
Text("Error occured: $error"),],));
}
Widget _buildUserWidget(MemberLogin data) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,children: [
Text("User widget"),));
}
当我单击按钮时,它会到达URL并获取数据,但未显示CircularProgressIndicator
。
但是,如果我在initState()中写入bloc.getUser();
,则会显示正在加载。但是我想在单击按钮后得到负载。
BLoC类别:
class UserBloc {
final UserRepository _repository = UserRepository();
final BehaviorSubject _subject = BehaviorSubject();
getUser() async {
MemberLogin respOnse= await _repository.getUser();
_subject.sink.add(response);
}
dispose() {
_subject.close();
}
BehaviorSubject get subject => _subject;
}
final bloc = UserBloc();
class UserRepository{
MemberApiProvider _apiProvider = MemberApiProvider();
Future getUser(){
return _apiProvider.getUser();
}
}
我正在从API获取数据,但是唯一的问题是显示加载进度。
您的RaisedButton onPress()将永远不会打开小部件。
因为onPress()是一种用于处理或处理数据,事件和功能的方法。
onPress()不需要或正在寻找要在屏幕上呈现的窗口小部件。 onPress()是一个函数,而不是Structure或Widget。
对于您而言, bloc.getUser(); 可以,因为它是一个函数。但是您已经在函数内部编写了StreamBuilder Widget。不应在函数中添加哪个。
将其放在您的构建方法中,您将可以在屏幕上查看/呈现它。