按下材质按钮后如何调用Stream Builder



上下文:由于某种原因,当我单击按钮时,流生成器内部的逻辑没有被调用。他进行api调用以验证用户,并输入stream: userBloc.authenticationUserStream而不是builder

我尝试了什么:尝试查看UserBloc类是否存在某种返回问题,但我认为一切都是正确的。我有一些其他的小部件,它不涉及点击按钮(我可以从构造函数中调用api(,它工作得很好,所以我认为问题可能出在点击状态上。

这是我在UI中的代码:

class _LoginScreenState extends State<LoginScreen> {
@override
void initState() {
super.initState();
userBloc = UserBloc();
}
}
final loginButton = Material(
elevation: 5.0,
borderRadius: BorderRadius.circular(30.0),
color: Color(0xff01A0C7),
child: MaterialButton(
minWidth: MediaQuery.of(context).size.width,
padding: EdgeInsets.fromLTRB(20, 15, 20, 15),
onPressed: () {
userBloc.authenticateUser(emailController.text.toString(),
passwordController.text.toString());
StreamBuilder<ApiResponse<LoginResponse>>( // does not enter here
stream: userBloc.authenticationUserStream,
builder: (context, snapshot) {
if (snapshot.hasData) {
switch (snapshot.data.status) {
case Status.LOADING:
return Loading(
loadingMessage: snapshot.data.message,
);
break;
case Status.COMPLETED:
Navigator.push(
context,
MaterialPageRoute(builder: (context) => MovieScreen()),
);
break;
case Status.ERROR:
Scaffold.of(context).showSnackBar(SnackBar(
content: Text("Error"),
));
break;
}
}
return Container();
});
},
child: Text("Login", textAlign: TextAlign.center),
),
);

这是我的UserBloc代码

class UserBloc {
UserRepository userRepository;
StreamController streamController;
StreamSink<ApiResponse<LoginResponse>> get authenticationUserSink =>
streamController.sink;
Stream<ApiResponse<LoginResponse>> get authenticationUserStream =>
streamController.stream;
UserBloc() {
streamController = StreamController<ApiResponse<LoginResponse>>();
userRepository = UserRepository();
}
authenticateUser(String email, String password) async {
authenticationUserSink.add(ApiResponse.loading("Logging"));
try {
// success
LoginResponse loginResponse =
await userRepository.authenticateUser(email, password);
authenticationUserSink.add(ApiResponse.completed(loginResponse));
} catch (e) {
// error
authenticationUserSink.add(ApiResponse.error(e.toString()));
}
}
dispose() {
streamController?.close();
}
}

有人能帮我理解一下按下按钮后如何称呼这种东西吗。如果需要,我可以分享我的user repository代码,提前感谢您的帮助。

您可以引用https://medium.com/flutter-community/handling-network-calls-like-a-pro-in-flutter-31bd30c86be1

您需要将StreamBuilder<ApiResponse<LoginResponse>>移到不在onPressed((中的body/UI子级
演示代码片段

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Movie Mania')),
backgroundColor: Colors.black54,
body: RefreshIndicator(
onRefresh: () => _bloc.fetchMovieList(),
child: StreamBuilder<ApiResponse<List<Movie>>>(
stream: _bloc.movieListStream,
builder: (context, snapshot) {
if (snapshot.hasData) {
switch (snapshot.data.status) {
case Status.LOADING:
return Loading(
loadingMessage: snapshot.data.message,
);
break;
case Status.COMPLETED:
return MovieList(movieList: snapshot.data.data);
break;
case Status.ERROR:
return Error(
errorMessage: snapshot.data.message,
onRetryPressed: () => _bloc.fetchMovieList(),
);
break;
}
}
return Container();
},
),
),
);
}

相关内容

最新更新