簡體   English   中英

flutter-異步函數始終返回null,但不為null

[英]flutter - async function always returns null, while it is not null

我正在為我的項目使用Bloc Architect。 我正在嘗試使用應用程序Ui中Bloc文件中的函數,並將表單發送到服務器並使用響應。 但是當我撥打電話時,它返回null。 雖然響應在我的應用程序的其他部分(即回購等)中不為空,但這是我的Ui的代碼:

MaterialButton(
                      color: Colors.deepPurple,
                      minWidth: screenAwareSize(500, context),
                      onPressed: () {
                        _submitForm(authBloc, user, pass);
                      },
 void _submitForm(AuthBloc authBloc, String user, String pass) async {
    formKey.currentState.save();
    if (formKey.currentState.validate()) {
      var response = await authBloc.login(user, pass);
//when I print(response) it shows null


    }
  }

這是我的集團課:

class AuthBloc extends MainBloc {
  final Repo _repo = Repo();
  PublishSubject<Future<UserModel>> _authController = new PublishSubject<Future<UserModel>>();
  Observable<Future<UserModel>> get auth => _authController.stream;
  login(String user, String pass) async {

    Future<UserModel> item = await _repo.login(user, pass);
    _authController.sink.add(item);
  }

  dispose() {
    _authController.close();
  }
}

AuthBloc authBloc = new AuthBloc();

這是我的API類:

class API{
 Future<UserModel> login(String user, String pass) async {
    var response =
        await client.get(base_url + "login.php?user=${user}&pass=${pass}");
    return UserModel.fromJSON(json.decode(response.body));
  }}

這是我的回購類:

 class Repo {
    final API api = new API();
  login(String user, String pass) async => await api.login(user, pass);}

您的函數login(String user, String pass)似乎未返回任何內容。 默認情況下,它將返回Future<void> 這就是為什么您的答復為空。

解決此問題的最簡單方法是按以下方式在登錄功能中返回項目。

    Future<UserModel> login(String user, String pass) async {
    return _repo.login(user, pass);
  }

雖然,這可能有效。 我認為這不是以Rx方式使用Bloc架構的合適方法。

您可以在視圖中考慮使用FutureBuilderStreamBuilder 並將您的auth轉換為Future<UserModel>類型。 並使您的視圖訂閱AuthBloc更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM