首页 > 解决方案 > 在颤动中从套接字返回一个值

问题描述

我写了一个 void 函数,它允许我拥有像这样的 nodejs 服务器的套接字数据

  Future<void> getCoordinate() async{
    //call socket
    GeocoordinateModel geocoordinateObject;
    Map<String,dynamic> geocoordinateMap;
   IO.Socket socket = IO.io(url,OptionBuilder().setTransports(['websocket']).build());
   socket.on("connect", (data) => {
     socket.on('geocoordinateData',(message)=>{
       if(message){
         geocoordinateMap = Map<String,dynamic>.from(message['payload']),
         geocoordinateObject =  GeocoordinateModel.fromMap(geocoordinateMap),
         print(geocoordinateObject),
       }
  }),
  });

  //return geocoordinateObject;
  }

现在,现在我想返回函数的变量 geocoordinateObject 我尝试了这段代码,但它没有用

import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:real_chat/data/model/geocoordinate_model.dart';
import 'package:socket_io_client/socket_io_client.dart' as IO;
import 'package:socket_io_client/socket_io_client.dart';
class GeocoordinateApi {
  static const String url = 'https://xxx.herokuapp.com/';
  Future<GeocoordinateModel?> getCoordinate() async{
    //call socket
    GeocoordinateModel? geocoordinateObject;
    Map<String,dynamic> geocoordinateMap;
   IO.Socket socket = IO.io(url,OptionBuilder().setTransports(['websocket']).build());
   socket.on("connect", (data) => {
     socket.on('geocoordinateData',(message)=>{
       if(message){
         geocoordinateMap = Map<String,dynamic>.from(message['payload']),
         geocoordinateObject =  GeocoordinateModel.fromMap(geocoordinateMap),
         print(geocoordinateObject),
       }
  }),
  });

  return geocoordinateObject;
  }
}

但它返回 null

标签: fluttersockets

解决方案


使用完成者来创造自己的未来。

脚步

  1. 实例化一个完成者
final completer = Completer<GeocoordinateModel?>();
  1. 完成完成者
completer.complete(geocoordinateObject);
  1. 回归未来
return completer.future;

代码

Future<GeocoordinateModel?> getCoordinate() async {
  GeocoordinateModel? geocoordinateObject;
  Map<String, dynamic> geocoordinateMap;
  IO.Socket socket =
      IO.io(url, OptionBuilder().setTransports(['websocket']).build());
  // [NEW CODE]: Add a completer
  final completer = Completer<GeocoordinateModel?>();
  // You don't have to listen for 'connect'.
  socket.on(
    'geocoordinateData',
    (message) => {
      // if(message) doesn't check for null. It should be if(message != null).
      // If this is null safe code, you don't have to check for null.
      geocoordinateMap = Map<String, dynamic>.from(message['payload']),
      geocoordinateObject = GeocoordinateModel.fromMap(geocoordinateMap),
      // [NEW CODE]: send your object to the completer.
      completer.complete(geocoordinateObject);
    },
  );

  // return the future.
  return completer.future;
}

推荐阅读