我正在尝试使用dio&BLoC模式调用API时显示CircularProgressIndicator
。
这是代码:
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
。
但是,如果我在initState()中写入bloc.getUser();
,则会显示正在加载。但是我想在单击按钮后得到负载。
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获取数据,但是唯一的问题是显示加载进度。
答案 0 :(得分:0)
您的RaisedButton onPress()将永远不会打开小部件。
因为onPress()是一种用于处理或处理数据,事件和功能的方法。
onPress()不需要或正在寻找要在屏幕上呈现的窗口小部件。 onPress()是一个函数,而不是Structure或Widget。
对于您而言, bloc.getUser(); 可以,因为它是一个函数。但是您已经在函数内部编写了StreamBuilder Widget。不应在函数中添加哪个。
将其放在您的构建方法中,您将可以在屏幕上查看/呈现它。