Флаттер ждет ответа, не дает никакого ответа - PullRequest
0 голосов
/ 12 сентября 2018

Я все еще новичок в трепетании дротиков, сейчас я пытаюсь получить данные из REST API и socket.IO. В настоящее время у меня запутанная проблема, я пытался искать в интернете в течение 3 дней, но решения не найдено. У меня есть сценарии async и await, но функция, которую я добавил await, не дает никакого ответа и все еще делает паузу.

предполагается, что у меня есть два разных файла, первый - основной файл, а второй - вспомогательный файл.

main.dart

Future<List<ChatTile>> fetchChat(socketutil,id) async {

  socketutil.join(id); //STACK IN HERE
  SharedPreferences prefs = await SharedPreferences.getInstance();
  String messagePrefs = prefs.getString('messagePrefs');
  print("DUA");
  return await compute(parseListChat, messagePrefs);
}

helper.dart

Future<void> join(String id_room) async {
      String jsonData ='{"room_id" : "$id_room","user_id" : "5a91687811138e74009839c9","user_name" : "Denis Muhammad Ramdan","user_photo" : "photo.jpg","user_status" : "1"}';
      socketIO.sendMessage("join", jsonData, null);
      //subscribe event
      return await socketIO.subscribe("updateMessageList", (result) async {
        SharedPreferences prefs = await SharedPreferences.getInstance();
        await prefs.setString('messagePrefs', result);
        print('SATU');
        return await result;
      });
  }

мой вопрос, что-то не так с моим кодом, и как лучше?

большое спасибо,

1 Ответ

0 голосов
/ 12 сентября 2018

Я предлагаю вам добавить await_only_futures в конфигурацию вашего анализатора

analysis_options.yaml

lint:
  rules:
   - await_only_futures

Вам также не нужно делать return await something, поскольку ваша функция уже возвращает будущее, это является избыточным.

И из того, что я вижу в методе подписки socketio, он не возвращает результат, как вы ожидаете, но использует обратный вызов и не возвращает его (https://pub.dartlang.org/documentation/flutter_socket_io/latest/flutter_socket_io/SocketIO/subscribe.html)

, чтобы справиться с этим, вы должны использовать Completer

final completer = Completer<String>()

socketIO.subscribe("updateMessageList", (result) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setString('messagePrefs', result);
    socketIO.unSubscribe("updateMessageList");
    completer.complete(result);
  });

return completer.future;

вы, вероятно, захотите обработать ошибку при использовании completer.completeError(error)

Обновление

Вы можете преобразовать подписку в Dart Stream для обработки большего количества случаев.

StreamController<String> controller;

Stream<String> get onUpdateMessageList {
   if (controller != null) return controller.stream;

   constroller = StreamController<String>.broadcast(
     onCancel: () => socketIO.unSubscribe("updateMessageList"),
   );

   socketIO.subscribe("updateMessageList", constroller.add);

   return controller.stream;
}



Future<StreamSubscription> join(String id_room) async {
  ...
  return onUpdateMessageList.listen((result) async {
   SharedPreferences prefs = await SharedPreferences.getInstance();
   await prefs.setString('messagePrefs', result);
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...