Flutter 按下材质按钮后如何调用流生成器?
上下文:由于某种原因,当我单击按钮时,流生成器中的逻辑没有被调用。他进行api调用以验证用户并输入流:userBloc.authenticationUserStream,但不输入生成器 我尝试了什么:尝试查看UserBloc类是否存在某种返回问题,但我认为一切都是正确的。我有一些其他小部件,不涉及点击按钮,我可以从构造器的api,它的工作很好,所以我认为问题可能是在点击状态 这是我在UI中的代码:Flutter 按下材质按钮后如何调用流生成器?,flutter,bloc,Flutter,Bloc,上下文:由于某种原因,当我单击按钮时,流生成器中的逻辑没有被调用。他进行api调用以验证用户并输入流:userBloc.authenticationUserStream,但不输入生成器 我尝试了什么:尝试查看UserBloc类是否存在某种返回问题,但我认为一切都是正确的。我有一些其他小部件,不涉及点击按钮,我可以从构造器的api,它的工作很好,所以我认为问题可能是在点击状态 这是我在UI中的代码: class _LoginScreenState extends State<LoginSc
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),
),
);
有人能帮我理解在按下按钮后如何调用这种东西吗。如有必要,我可以共享我的用户存储库代码,提前感谢您的帮助。您可以参考此信息
您需要将StreamBuilder移出到非onPressed中的body/UI子级
演示代码片段
是的,与此同时,我就这么做了。谢谢你的帮助。既然答案是正确的,我就认为它是被接受的:
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();
}
}
@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();
},
),
),
);
}