当前位置: 首页 > 知识库问答 >
问题:

世博会地点、世博会任务管理器和上下文API react native

杨曜瑞
2023-03-14
import React, { createContext, useContext, useState, useEffect } from 'react';
import {
  authenticationService,
  getUserProfileService,
} from '../services/user-service';
import { getDonationHistory } from '../services/donation-service';
import AsyncStorage from '@react-native-async-storage/async-storage';
import * as TaskManager from 'expo-task-manager';
import * as Location from 'expo-location';
import * as BackgroundFetch from 'expo-background-fetch';

const UserInfoContext = createContext();

const UserInfoProvider = ({ children }) => {
  const [isLoggedIn, setIsLoggedIn] = useState(false);
  const [userProfile, setUserProfile] = useState({
    donorId: '',
    icNo: '',
    fName: '',
    lName: '',
    bloodType: '',
  });
  const [errorMessage, setErrorMessage] = useState(null);
  const [location, setLocation] = useState({ latitude: '', longitude: '' });

  let updateLocation = (loc) => {
    setLocation(loc);
  };

  console.log(location);

  const sendBackgroundLocation = async () => {
    const { status } = await Location.requestForegroundPermissionsAsync();
    if (status === 'granted') {
      const { status } = await Location.requestBackgroundPermissionsAsync();
      if (status === 'granted') {
        await Location.startLocationUpdatesAsync('LocationUpdate', {
          accuracy: Location.Accuracy.Balanced,
          timeInterval: 10000,
          distanceInterval: 1,
          foregroundService: {
            notificationTitle: 'Live Tracker',
            notificationBody: 'Live Tracker is on.',
          },
        });
      }
    }
  };

  const _requestLocationPermission = async () => {
    (async () => {
      let { status } = await Location.requestForegroundPermissionsAsync();
      if (status == 'granted') {
        let { status } = await Location.requestBackgroundPermissionsAsync();
        if (status == 'granted') {
        } else {
          console.log('Permission to access location was denied');
        }
      } else {
        console.log('Permission to access location was denied');
      }
    })();
  };

  sendBackgroundLocation();

  const getUserProfile = () => {
    return userProfile;
  };

  useEffect(() => {
    (async () => await _requestLocationPermission())();
    retrieveAuthTokens();
    retrieveUserProfile();
  });

  let retrieveAuthTokens = async () => {
    try {
      const authTokens = await AsyncStorage.getItem('authTokens');
      authTokens ? setIsLoggedIn(true) : setIsLoggedIn(false);
    } catch (error) {
      console.log(error.message);
    }
  };

  let retrieveUserProfile = async () => {
    try {
      const userProfile = JSON.parse(await AsyncStorage.getItem('userProfile'));
      userProfile
        ? setUserProfile({
            donorId: userProfile.donorId,
            icNo: userProfile.appUser.username,
            fName: userProfile.fName,
            lName: userProfile.lName,
            bloodType: userProfile.bloodType,
          })
        : null;
    } catch (error) {
      console.log(error.message);
    }
  };

  let loginUser = (values) => {
    authenticationService(values)
      .then(async (data) => {
        if (data !== undefined && data !== null) {
          const tokens = data.data;
          await AsyncStorage.setItem('authTokens', JSON.stringify(tokens));
          getProfile(values.icNo);
          getHistories(userProfile.donorId);
          setErrorMessage(null);
        } else {
          setErrorMessage('Wrong email/password!');
        }
      })
      .catch((error) => console.log(error.message));
  };

  let logoutUser = async () => {
    try {
      await AsyncStorage.clear().then(console.log('clear'));
      setIsLoggedIn(false);
    } catch (error) {
      console.log(error.message);
    }
  };

  getProfile = (icNo) => {
    getUserProfileService(icNo)
      .then(async (res) => {
        if (res !== undefined && res !== null) {
          const profile = res.data;
          await AsyncStorage.setItem('userProfile', JSON.stringify(profile));
          setIsLoggedIn(true);
        }
      })
      .catch((error) => console.log(error.message));
  };

  const getHistories = (userId) => {
    getDonationHistory(userId)
      .then(async (res) => {
        if (res !== undefined && res !== null) {
          const historyData = res.data;
          await AsyncStorage.setItem(
            'donationHistories',
            JSON.stringify(historyData)
          );
        } else {
          console.log('no data');
        }
      })
      .catch((error) => console.log(error.message));
  };

  let contextData = {
    loginUser: loginUser,
    logoutUser: logoutUser,
    isLoggedIn: isLoggedIn,
    errorMessage: errorMessage,
    userProfile: userProfile,
    getHistories: getHistories,
  };

  return (
    <UserInfoContext.Provider value={contextData}>
      {children}
    </UserInfoContext.Provider>
  );
};

export const useUserInfo = () => useContext(UserInfoContext);

export default UserInfoProvider;

function myTask() {
  try {
    const backendData = 'Simulated fetch ' + Math.random();
    return backendData
      ? BackgroundFetch.BackgroundFetchResult.NewData
      : BackgroundFetch.BackgroundFetchResult.NoData;
  } catch (err) {
    return BackgroundFetch.BackgroundFetchResult.Failed;
  }
}

async function initBackgroundFetch(taskName, interval = 60 * 15) {
  try {
    if (!TaskManager.isTaskDefined(taskName)) {
      TaskManager.defineTask(taskName, ({ data, error }) => {
        if (error) {
          console.log('Error bg', error);
          return;
        }
        if (data) {
          const { locations } = data;
          console.log(
            locations[0].coords.latitude,
            locations[0].coords.longitude
          );

          //-----------------doesnt work ----------------------------
          UserInfoProvider.updateLocation({
            latitude: locations[0].coords.latitude,
            longitude: locations[0].coords.longitude,
          });
          //-----------------doesnt work ----------------------------
        }
      });
    }
    const options = {
      minimumInterval: interval, // in seconds
    };
    await BackgroundFetch.registerTaskAsync(taskName, options);
  } catch (err) {
    console.log('registerTaskAsync() failed:', err);
  }
}

initBackgroundFetch('LocationUpdate', 5);

我正在尝试更新UserInfoProvider中的位置状态,此位置信息将与在此提供程序中检索到的userprofile详细信息一起发送到firestore。

然而,我似乎无法访问

用户InfoProvider。updateLocation()

在UserInfoProvider组件之外。

无论如何,我可以从后台任务中获取用户配置文件信息和位置信息,并将它们发送到fiRecovery吗?

目前,只有

console.log(地点[0].coords.latitude,地点[0].coords.longitude);

在后台任务似乎正在工作。

我得到的错误:

TaskManager:任务“LocationUpdate”失败:,[TypeError:undefined不是节点\u modules\react native\Libraries\LogBox\LogBox处的函数(靠近“…UserInfoProvider.updateLocation…”)。js:149:8,位于node\u modules\react native\Libraries\LogBox\LogBox的registerError中。js:60:8在errorImpl at node\u modules\react native\Libraries\LogBox\LogBox中。控制台中的js:34:4。node\u modules\expo\build\environment\react本机日志出错。外汇。js:27:4在node\u modules\expo task manager\build\TaskManager处出错。js:143:16在eventEmitter中。在节点\模块\再生器运行时\运行时添加侦听器$argument\u 1。js:63:36,在节点\模块\再生器运行时\运行时的tryCatch中。js:294:29在节点\模块\再生器运行时\运行时调用中。js:63:36,在节点\模块\再生器运行时\运行时的tryCatch中。js:155:27 in invoke at node\u modules\regulator runtime\runtime。js:190:16,位于node\u modules\react native\node\u modules\promise\setimmediate\core的PromiseImpl$argument\u 0中。js:45:6,tryCallTwo at node\u modules\react native\node\u modules\promise\setimmediate\core。js:200:22,doResolve at node\u modules\react native\node\u modules\promise\setimmediate\core。js:66:11在node\u modules\regulator runtime\runtime的Promise中。js:189:15在callInvokeWithMethodAndArg的node\u模块\再生器运行时\运行时中。js:212:38在node\u模块\再生器运行时\运行时排队。js:239:8出口。在node\u modules\expo task manager\build\TaskManager上异步。js:133:57在eventEmitter中。在node\u modules\react native\Libraries\vendor\emitter\u EventEmitter处添加Listener$argument\u 1。js:135:10在EventEmitter中#emit at node_modules\react native\Libraries\BatchedBridge\MessageQueue。js:414:4,位于node\u modules\react native\Libraries\BatchedBridge\MessageQueue的调用函数中。js:113:6,位于node\u modules\react native\Libraries\BatchedBridge\MessageQueue的\uu guard$argument\u 0中。js:365:10在节点模块\反应本机\库\批处理桥\消息队列的\uu guard中。调用函数ReturnFlushedQueue中的js:112:4

共有1个答案

柴亦
2023-03-14

通过查看UserInfoProvider的上下文值:

let contextData = {
    loginUser: loginUser,
    logoutUser: logoutUser,
    isLoggedIn: isLoggedIn,
    errorMessage: errorMessage,
    userProfile: userProfile,
    getHistories: getHistories,
  };


更新位置功能不可用,您无法访问。

您需要使用useUserInfo来消耗UserInfoProvider值。

 类似资料:
  • 我正在尝试运行我的反应原生应用程序,我在android模拟器和我的手机HUAWEI Y3II上运行它,同样的事情也会发生。几天前我正在很好地处理它,但突然出现了这个错误: 我尝试将环境变量REACT_NATIVE_PACKAGER_HOSTNAME设置为我的ip地址,我尝试关闭防火墙,我确保防火墙中允许端口,我尝试将我的网络从公用改为专用。这是我的包裹。json文件: 我真的需要努力,请帮帮我

  • 一面 英文自我介绍 mr的shuffle zookeeper选举 spark内存管理 hbase中region的拆分 数仓中都有什么表 怎么处理缓慢变化维,拉链表有用过吗 yarn的架构 namenode ha的实现 namenode启动过程中怎么确定哪个是active哪个是standby spark sql用的多吗 手撕 中等leetcoode,合并区间 二面 自我介绍 家哪里的 对博世有什么了

  • 我正在考虑使用博览会在React Native中构建移动应用程序,我在常见问题下注意到现有的React Native项目可以转换为博览会。 我们到底在转换什么?我真的喜欢尽可能地保持纯净和干净,而中间没有太多抽象层,这会掩盖我理解应用程序中发生的事情的能力。 我希望能对改造过程中的实际情况以及世博会为现有项目增加的内容进行更多的澄清。

  • 技术面45分钟 英文自我介绍+提问:在上一家公司做了什么?是哪里的人? 实习的时候做了什么? 有没有给你实习所在的公司提过什么意见来更好地推进项目? 到目前为止让你压力最大的事是什么? 在学校学过哪些课程? 在学校学习python的形式是什么?我回答期末考试+课设,然后问了课设做的什么内容,具体用了python的哪些库。 在学校学的课程对你的实习有什么帮助?具体句一个例子。 python八股文:装

  • 我想创建我自己的播客应用程序。 我在网上找到了这段预先编写的代码(),并想对其进行调整,以便创建我自己的应用程序。 如何将此代码上载到expo?

  • 我有一个用展览编写的应用程序,但不知道如何推送新版本。在博览会网站上,如果我从二维码运行应用程序,应用程序是正确的,但应用程序商店的本机应用程序不会更新。 我使用的步骤是1)exp build:android 2)exp publish 如何让应用程序真正更新?