flutter - 在颤动中从套接字返回一个值
问题描述
我写了一个 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
解决方案
使用完成者来创造自己的未来。
脚步
- 实例化一个完成者
final completer = Completer<GeocoordinateModel?>();
- 完成完成者
completer.complete(geocoordinateObject);
- 回归未来
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;
}
推荐阅读
- php - 如何从php中的数组中删除特定元素
- git - 每次推送两个特定分支时,在 AWS::CodePipeline::Pipeline 中添加更多分支以启动管道
- javascript - 为什么隐藏的详细信息行在 BIRT 表中重复?
- python - 如何从当前脚本执行另一个 Python 文件?
- mysql - 在 mySQL 的另一个表中显示来自一个特定用户的数据
- bash - sed 在具有多次出现的 JSON 文件的 2 种模式之间替换
- ubuntu - nginx.service启动失败:未找到单元nginx.service
- keycloak - 将 Keycloak 与 Freeradius 集成
- kubernetes - 在本地基础设施上使用 DMZ 的入口
- tensorflow - InvalidArgumentError:矩阵大小不兼容:In[0]:[256,3],In[1]:[65,1] [[{{node dense_51/BiasAdd}}]]