React Native 在监听特征时丢失对状态的引用

wyyhbhjk  于 12个月前  发布在  React
关注(0)|答案(1)|浏览(113)

所以我尝试了多种方法来存储状态,但由于某种原因,我不明白为什么我会丢失某些上下文的(最新)状态。我使用以下函数来获取特定特征的更新(我还直接在特征上尝试了.monitor())。

// This is in the BluetoothProvider
device.monitorCharacteristicForService(
    service.uuid,
    characteristic.uuid,
    onUpdate)

字符串
此外,我有一个函数来检查状态:

// This is in the BluetoothProvider
const updating = () => {
    if (currentMatch != null && currentPerson != null) {
        console.log('found person')
    } else {
        console.log('no person')
    }
}


属性存储在一个带有API/Data MatchProvider提供程序的reducer中:

const { currentMatch, currentPerson } = useContext(MatchDataContext)


onUpdate函数:

const onUpdate = (
    error: BleError | null,
    characteristic: Characteristic | null
) => {
    updating()
}


供应商在正确的地方:

<MatchProvider>
    <BluetoothProvider>
      <Routes>
      </Routes>
    </BluetoothProvider>
  </MatchProvider>


我试过把它移动到另一个组件/提供程序/redux,没关系。onUpdate函数就是不能得到正确的状态。UI工作得很好,状态被存储了,但是onUpdate方法从来没有得到值。

ogsagwnx

ogsagwnx1#

最终我找到了修复方法,我所做的就是将以下内容添加到BluetoothProvider

const matchRef = useRef(currentMatch);
const personRef = useRef(currentPerson);

React.useEffect(() => {
    matchRef.current = currentMatch
    personRef.current = currentPerson
}, [currentMatch, currentPerson]);

字符串
这让我可以监听MatchDataContext的更新并存储引用,因为在这个文件中,当蓝牙设备收到一条新消息时,我会触发一个订阅,而这不是最新的状态。

const onUpdate = (
    error: BleError | null,
    characteristic: Characteristic | null
) => {
    if (matchRef.current != null && personRef.current != null) {
        console.log('using match', JSON.stringify(matchRef.current, null, 2))
    }
}


出于某种原因,所有调试工具都指示该值在BluetoothProvider中,但当我调用该属性时,它为null。

相关问题