Flutter 在两个可设置的特性上设置NotifyValue

Flutter 在两个可设置的特性上设置NotifyValue,flutter,dart,bluetooth,bluetooth-lowenergy,android-bluetooth,Flutter,Dart,Bluetooth,Bluetooth Lowenergy,Android Bluetooth,我似乎无法在同一个BLE服务中为多个特征设置NotifyValue。当调用第二个setNotifyValue时,应用程序总是崩溃 如果我在其中一个特征上注释setNotifyValue并重新编译,则该应用程序运行良好,并提供传入数据的实时流 类DeviceScreen扩展了无状态小部件{ const DeviceScreen({Key,this.device}):super(Key:Key); 最终蓝牙设备; 静态字符串特征\u UUID\u BTN= “0000ab0a-1212-efde-

我似乎无法在同一个BLE服务中为多个特征设置NotifyValue。当调用第二个setNotifyValue时,应用程序总是崩溃

如果我在其中一个特征上注释setNotifyValue并重新编译,则该应用程序运行良好,并提供传入数据的实时流


类DeviceScreen扩展了无状态小部件{
const DeviceScreen({Key,this.device}):super(Key:Key);
最终蓝牙设备;
静态字符串特征\u UUID\u BTN=
“0000ab0a-1212-efde-1523-785fef13d123”;
静态字符串特性\u UUID\u温度=
“0000beef-1212-efde-1523-785fef13d123”;
Widget\u myService(列表服务){
溪流btn_溪流;
温度流;
services.forEach((服务){
服务。特征。forEach((字符){
if(character.uuid.toString()==特征\u uuid\u BTN){
字符.setNotifyValue(true);
btn_流=character.value;
}
if(character.uuid.toString()=特征值){
字符.setNotifyValue(true);
temp_stream=character.value;
}
});
});
返回容器(
//埃里克码
孩子:StreamBuilder(
流:btn_流,
生成器:(构建上下文上下文,异步快照btn\U快照){
返回流生成器(
流:临时流,
建设者:
(BuildContext上下文,异步快照临时\u快照){
如果(btn_snapshot.hasError)
返回文本('Error:${btn_snapshot.Error}');
if(临时快照hasError)
返回文本('Error:${temp_snapshot.Error}');
if((btn_snapshot.data!=null)和&(temp_snapshot.data!=null)){
如果((btn_snapshot.data.length!=0)&&
(temp_snapshot.data.length!=0)){
int incoming_counts=btn_snapshot.data[0];
int incoming_temp=temp_snapshot.data[0];
返回文本(传入的_counts.toString()+
" " +
传入的_temp.toString());
}否则{
返回文本(“已同步!正在等待输入”);
//返回文本(btn_snapshot.data.toString()+
//  " " +
//temp_snapshot.data.toString());
}
}否则{
返回文本(“正在等待同步…”);
//返回文本(btn_snapshot.data.toString()+
//    " " +
//temp_snapshot.data.toString());
}
},
);
},
));
}
我希望“传入的\u计数”和“传入的\u临时”都能实时更新,因为蓝牙外围设备提供了新的数据。但是,在分配流时,第二次调用字符。setNotifyValue(true);会抛出一个错误:

发生异常。
PlatformException(PlatformException(set_notification_error,写入描述符时出错,null))

我不知道颤振层的作用,但如果您使用蓝牙标准Android API,则必须等待回调,该回调指示上一个GATT操作已完成(onDescriptorWrite)直到你可以编写下一个描述符来启用特征通知。Emil,我想你已经帮我解决了一个问题。知道程序通过特征UUID比较的工作顺序,我嵌入了第二次调用setNotifyingValue的时间延迟为2秒。值得注意的是,1秒的延迟似乎只起作用现在看起来是这样的:Future.delayed(新的持续时间(秒数:2),(){character.setNotifyValue(true);});btn_stream=character.value;在某些情况下它可能会工作,但您永远不知道蓝牙事务将花费多长时间(这取决于连接参数,是否由于信号不好等原因需要发送数据包)。你应该真正尝试“正确”的方法,并等待结果,然后再编写下一个描述符。当然,如果我能找到修复方法,我会继续挖掘并发回。我相信我不是唯一遇到这种情况的人。