[英]Widget is not display with onPressed event of RaisedButton
I am trying to show CircularProgressIndicator
while calling API with dio & BLoC pattern.我试图在使用 dio & BLoC 模式调用 API 时显示CircularProgressIndicator
。
Here is the code :这是代码:
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"),
],
));
}
When i click on button it hits the url and get the data but it is not showing CircularProgressIndicator
.当我点击按钮时,它会点击 url 并获取数据,但它没有显示CircularProgressIndicator
。 But if i write bloc.getUser();
但是如果我写bloc.getUser();
in initState() then it show the loading.在 initState() 然后它显示加载。 But i want to get the loading after click on button.但我想在点击按钮后加载。
BLoC class : 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();
}
}
I am getting data from API but only problem is for showing loading progress.我正在从 API 获取数据,但唯一的问题是显示加载进度。
Your RaisedButton onPress() will never open a widget.您的 RaisedButton onPress() 永远不会打开小部件。
Because, onPress() is a method used to handle or your data processing, events and functions.因为,onPress() 是一种用于处理或您的数据处理、事件和函数的方法。
onPress() is not expecting or looking for a Widget to render on the screen. onPress() 不期望或寻找在屏幕上呈现的小部件。 onPress() is a function not a Structure or Widget. onPress() 是一个函数,而不是结构或小部件。
In your case, bloc.getUser();在你的情况下, bloc.getUser(); is okay as it is a function.没关系,因为它是一个函数。 But you have already written a StreamBuilder Widget inside a function.但是您已经在函数中编写了一个 StreamBuilder 小部件。 Which should not be added inside the function.不应该在函数内部添加。
Place it inside your build method and you will be able to view/render it on your screen.将它放在您的构建方法中,您将能够在屏幕上查看/渲染它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.