【发布时间】:2021-04-07 13:17:46
【问题描述】:
我是 React Native 和 Expo 的新手,我想尝试使用 Accelerometer 组件来构建一个神奇的 8 球游戏,用户在摇晃他们的 android 时可以获得问题的答案。
我在一个名为 MagicAnswer.js 的组件中有 fetch,现在想将该组件连接到 ShakeSensor.js 我想我需要在组件中进行一些重组,但希望我可以调用 ShakeSensor在 StartPage 中显示神奇的答案,但我目前的问题是答案不会留在屏幕上。
我更新到这个(见下面的代码):isShaking(data) &&
// ShakeSensor.js component:
import React, { useState, useEffect } from 'react';
import { Accelerometer } from 'expo-sensors';
import styled from 'styled-components/native';
import { MagicAnswer } from './MagicAnswer'
// ==========================
// = Functions
const isShaking = (data) => {
const totalForce = Math.abs(data.x) + Math.abs(data.y) + Math.abs(data.z);
return totalForce > 1.78;
};
// ==========================
// = Styled components
const ShakeView = styled.View`
display: flex;
flex-direction: column;
`;
const ShakeAlert = styled.Text`
font-size: 36px;
font-weight: bold;
color: #aa0000;
`;
const ShakeDataView = styled.View``;
const ShakeDataTitle = styled.Text`
font-weight: bold;
`;
const ShakeData = styled.Text``;
export const ShakeSensor = () => {
Accelerometer.setUpdateInterval(400);
const [data, setData] = useState({
x: 0,
y: 0,
z: 0,
});
const [subscription, setSubscription] = useState(null);
const _subscribe = () => {
setSubscription(
Accelerometer.addListener((accelerometerData) => {
setData(accelerometerData);
})
);
};
const _unsubscribe = () => {
subscription && subscription.remove();
setSubscription(null);
};
useEffect(() => {
_subscribe();
return () => _unsubscribe();
}, []);
return (
<ShakeView>
{isShaking(data) && <MagicAnswer></MagicAnswer>}
<ShakeDataView>
<ShakeDataTitle>Shake Data</ShakeDataTitle>
<ShakeData>X: {data.x.toFixed(2)}</ShakeData>
<ShakeData>Y: {data.y.toFixed(2)}</ShakeData>
<ShakeData>Z: {data.z.toFixed(2)}</ShakeData>
</ShakeDataView>
</ShakeView>
)
}
【问题讨论】:
-
到底是什么问题?有没有错误?
-
我已经更新了我的 OP。并尝试将我的 MagicAnswer.js 安装在 ShakeSensor.js 中。我的问题是了解如何让 MagicAnswer 留在屏幕上。
-
答案没有停留在屏幕上是什么意思?所以它出现然后消失,你想保留它吗?
-
是的,我尝试了
{isShaking(data) && <MagicAnswer></MagicAnswer>} {isShaking(data) && _unsubscribe()},但这会产生太多循环。
标签: react-native expo android-sensors