Flutter 按下材质按钮后如何调用流生成器?

Flutter 按下材质按钮后如何调用流生成器?,flutter,bloc,Flutter,Bloc,上下文:由于某种原因,当我单击按钮时,流生成器中的逻辑没有被调用。他进行api调用以验证用户并输入流:userBloc.authenticationUserStream,但不输入生成器 我尝试了什么:尝试查看UserBloc类是否存在某种返回问题,但我认为一切都是正确的。我有一些其他小部件,不涉及点击按钮,我可以从构造器的api,它的工作很好,所以我认为问题可能是在点击状态 这是我在UI中的代码: class _LoginScreenState extends State<LoginSc

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

我尝试了什么:尝试查看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),
      ),
    );
有人能帮我理解在按下按钮后如何调用这种东西吗。如有必要,我可以共享我的用户存储库代码,提前感谢您的帮助。

您可以参考此信息

您需要将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();
          },
        ),
      ),
    );
  }