RNCalendarEvents.saveEvent()问题,错误:未设置日历

问题描述 投票:1回答:1

我的react-native-calendar-events代码抛出错误,错误是说No calendar has been set,但我不知道为什么会这样。我的应用的旧版上的相同代码可在相同设备上运行。

export async function createCalendarEvent(event) {
  const status = await RNCalendarEvents.authorizationStatus();
  console.log(status);
  if (status === "authorized" || status === "undetermined") {
    addToCalendar(event);
  } else {
    RNCalendarEvents.authorizeEventStore()
      .then(auth => {
        // handle status
        if (auth === "authorized" || auth === "undetermined") {
          addToCalendar(event);
        }
      })
      .catch(() => {
        alert("This app needs calendar access");
      });
  }
}

async function addToCalendar(event) {
  try {
    const startDate =
      Platform.OS === "ios"
        ? format(parse(event.StartDateLocal))
        : parse(event.StartDateLocal);
    const endDate =
      Platform.OS === "ios"
        ? format(parse(event.EndDateLocal))
        : parse(event.EndDateLocal);
    const allEvents = await RNCalendarEvents.fetchAllEvents(startDate, endDate);

    const calendarEvent = allEvents.find(e => e.title === event.Title);
    if (calendarEvent) {
      alert("You have already added this event to your calendar.");
    } else {
      const title = event.Title;

      const {
        Location: {
          AddressLine1: address,
          City: city,
          StateAbbreviation: state,
          PostalCode: zip
        }
      } = event;

      const location = `${address}, ${city}, ${state}, ${zip}`;

      const settings = {
        location,
        startDate,
        endDate
      };
      RNCalendarEvents.saveEvent(title, settings)
        .then(() => {
          alert("Event Saved");
        })
        .catch(rejectionReason => {
          console.log(rejectionReason);
          alert("Oops! Something has gone wrong.");
        });
    }
  } catch (e) {
    alert("Oops! Something has gone wrong with this request.");
  }
}

我最近在status === "authorized" || status === "undetermined"中添加了“或”,这在某种程度上阻止了iOS出现错误时完全崩溃。

我以为这可能是版本问题,但我回到了原来的版本,但仍然有这个问题。所以Promise出错了,但是为什么呢?

我像这样拼凑了一个最小可行的产品:

import React from "react";
import { Text, StyleSheet, View, TouchableOpacity } from "react-native";
import RNCalendarEvents from "react-native-calendar-events";
import parse from "date-fns/parse";
import format from "date-fns/format";

const ComponentsScreen = () => {
  async function addToCalendar(event) {
    console.log(RNCalendarEvents);
    try {
      RNCalendarEvents.saveEvent("Title of event", {
        startDate: "2016-08-19T19:26:00.000Z",
        endDate: "2017-08-19T19:26:00.000Z"
      })
        .then(() => {
          alert("Event Saved");
        })
        .catch(rejectionReason => {
          console.log(rejectionReason);
          alert("Oops! Something has gone wrong.");
        });
    } catch (e) {
      alert(e.message);
    }

并且RNCalendarEventssaveEvent()方法返回未定义,即使RNCalendarEvents I控制台日志返回了该API可用的所有方法。我以为这会提示链接问题,但是它应该是自动链接,无论如何我尝试过react-native link并仍未确定其方法。

我刚刚在调试过程中注意到react-native-calendar-events仍在使用index.ios.js。这可能就是为什么我找回RNCalendarEvents API的方法,但是当我尝试实现它们时,我得到了undefined

UPDATE:

我在MainActivity.java中添加了以下内容:

package com.nfibengage;
import android.os.Bundle;
import com.facebook.react.ReactActivity;
import com.facebook.react.ReactActivityDelegate;
import org.devio.rn.splashscreen.SplashScreen;
import android.view.MotionEvent;
import com.facebook.react.ReactRootView;
import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;

public class MainActivity extends ReactActivity {

    /**
     * Returns the name of the main component registered from JavaScript.
     * This is used to schedule rendering of the component.
     */
    @Override
    protected String getMainComponentName() {
        return "NFIBEngage";
    }

    /*
     * this is for https://github.com/crazycodeboy/react-native-splash-screen
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        SplashScreen.show(this);
        super.onCreate(savedInstanceState);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public void onRequestPermissionResult(int RequestCode, String[] permissions, int[] grantResults) {
      super.onRequestPermissionResult(RequestCode, permissions, grantResults);
      CalendarEventsPackage.onRequestPermissionResult(RequestCode, permissions, grantResults);
    }

而且我仍然收到No calendar has been set的相同错误消息。

所以我想我需要添加导入:import com.calendarevents.CalendarEventsPackage;。将其添加到MainActivity.java并再次运行Android模拟器后,在构建时出现以下错误:

错误:方法未从超类型重写或实现方法错误:找不到符号方法onRequestPermissionResult(int,String [],int [])错误:找不到符号方法onRequestPermissionResult(int,String [],int [])

我能够通过从以下位置删除error: method does not override or implement a method from a supertype来解决第一个错误:@Override:>

@Override
    public void onRequestPermissionResult(int RequestCode, String[] permissions, int[] grantResults) {
      super.onRequestPermissionResult(RequestCode, permissions, grantResults);
      CalendarEventsPackage.onRequestPermissionResult(RequestCode, permissions, grantResults);
    }

我的react-native-calendar-events代码抛出一个错误,该错误表明未设置日历,但是我不知道为什么会这样。我的应用的旧版上的相同代码适用于...

javascript react-native
1个回答
0
投票

我只能通过以下重构使它在iOS上正常工作:

© www.soinside.com 2019 - 2024. All rights reserved.