我仍然在关注 flutter 中的状态管理技术,并且对何时以及为什么使用Provider.of<X>vs. Consumer<X>. 我从文档中了解到(我认为)在这两者之间进行选择时,当我们想要访问数据时,您将使用 Provider.of,但您不需要更改 UI。因此,以下(取自文档)可以访问数据并在新事件上更新 UI:
return HumongousWidget(
// ...
child: AnotherMonstrousWidget(// <- This widget will rebuild on new data events
// ...
child: Consumer<CartModel>(
builder: (context, cart, child) {
return Text('Total price: ${cart.totalPrice}');
},
),
),
);
Run Code Online (Sandbox Code Playgroud)
然而,在这里我们只需要在数据上不希望与UI重建,我们会使用Provider.of<X>与listen参数集false,如下图所示:
Provider.of<CartModel>(context, listen: false).add(item); \\Widget won't rebuild
Run Code Online (Sandbox Code Playgroud)
但是,listen不是必需的,因此以下内容也将运行:
Provider.of<CartModel>(context).add(item); \\listener optional
Run Code Online (Sandbox Code Playgroud)
所以这给我带来了几个问题:
Provider.of<X>和的正确方法吗Consumer<X>?前者不更新用户界面,后者呢?listen未设置为false默认情况下会重建小部件还是不重建?如果listen设置为true呢?这里是全新的。
Tl; dr:iOS 设备是否可以发布可由另一台 iOS 设备扫描的 CB 广告(CBAdvertisementDataServiceUUIDsKey 和/或 CBAdvertisementDataLocalNameKey)?
我相信我的问题是基于 iOS 更高版本中对 CoreBluetooth 和 CoreLocation 的弃用和更改的新鲜问题。另外,就目前而言,我仅指“前台”操作。
从我阅读和测试的内容来看,外围设备可以使用 CL 传输信标区域(唯一的邻近 UUID,主要和次要(但特别是没有“标识符”))。使用 CB,外围设备还可以“通告”两个少量额外数据中的任何一个:CBAdvertisementDataServiceUUIDsKey 和 CBAdvertisementDataLocalNameKey。
我无法实现的是让设备(例如 iPhone)使用 CB 扫描这些附加键中的任何一个,也没有我提到的使用 CL 或 CB 的可选“标识符”。
指定扫描的唯一选项需要 CBUUID,但未发现的 iOS 外围设备在技术上不能宣传:
central.scanForPeripherals(withServices: [CBUUID]?, options: [String : Any]?)
Run Code Online (Sandbox Code Playgroud)
似乎以下内容可行,但似乎 adsData 不包含上面的键,即使是 [String : Any]:
func centralManager(_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String : Any],
rssi RSSI: NSNumber){
//code
}
Run Code Online (Sandbox Code Playgroud)
任何帮助/答案将不胜感激。谢谢!