我试图在CircularProgressIndicator
使用 dio 和 BLoC 模式调用 API 时显示。
这是代码:
class UserWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _UserWidgetState();
}
}
class _UserWidgetState extends State<UserWidget> {
@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<MemberLogin>(
stream: bloc.subject.stream,
builder: (context, AsyncSnapshot<MemberLogin> 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
。但是如果我bloc.getUser();
在 initState() 中写入,那么它会显示加载。但我想在点击按钮后加载。
BLoC 类:
class UserBloc {
final UserRepository _repository = UserRepository();
final BehaviorSubject<MemberLogin> _subject = BehaviorSubject<MemberLogin>();
getUser() async {
MemberLogin response = await _repository.getUser();
_subject.sink.add(response);
}
dispose() {
_subject.close();
}
BehaviorSubject<MemberLogin> get subject => _subject;
}
final bloc = UserBloc();
class UserRepository{
MemberApiProvider _apiProvider = MemberApiProvider();
Future<MemberLogin> getUser(){
return _apiProvider.getUser();
}
}
我从 API 获取数据,但唯一的问题是显示加载进度。