ReactNative奮闘記(2日目)

iOS編

RCTLogWarn

/Users/ikko/Desktop/Test2/Cucom-App/node_modules/@react-native-community/datetimepicker/ios/RNDateTimePickerShadowView.m:60:9:
 error: call to undeclared function 'RCTLogWarn'; ISO C99 and later do not support implicit function declarations 
[-Wimplicit-function-declaration]
        RCTLogWarn(@"'%@' does not exist in NSTimeZone.knownTimeZoneNames. Falling back to localTimeZone=%@", shadowPickerView.timeZoneName, NSTimeZone.localTimeZone.name);
        ^
1 error generated.

RCTLogWarnという関数が存在しないと言われているため、node_modules/@react-native-community/datetimepicker/ios/RNDateTimePickerShadowView.m

にアクセスして、該当するコードを削除。パッチを当てる。

$ npx patch-package @react-native-community/datetimepicker

もう一度コードを実行。

Invariant Violation: Tried to register two views with the same name RNDateTimePicker

エラーです。

RNDateTimePicker


キャッシュを削除してみる。

変わらないですね〜。

diff --git a/node_modules/react-native/scripts/react_native_pods.rb b/node_modules/react-native/scripts/react_native_pods.rb
index db9a34a..14cb4b3 100644
--- a/node_modules/react-native/scripts/react_native_pods.rb
+++ b/node_modules/react-native/scripts/react_native_pods.rb
@@ -4,6 +4,7 @@
 # LICENSE file in the root directory of this source tree.
 
 def use_react_native! (options={})
+  pod 'react-native-safe-area-context', :path => '../node_modules/react-native-safe-area-context'
   # The prefix to react-native
   prefix = options[:path] ||= "../node_modules/react-native"

RNDateTimePickerというpodが2回登録されていることによるエラーみたいです。このパッチが悪さをしている気がするので、パッチを消して動かす方法を考えてみます。

パッチを消してキャッシュ削除してもう一度実行しても同じエラーが出るので、原因はRCTLogWarnを削除した時のパッチにあることが分かりました。
↓RCTLogWarnを削除したときのパッチ

diff --git a/node_modules/@react-native-community/datetimepicker/ios/RNDateTimePickerShadowView.m b/node_modules/@react-native-community/datetimepicker/ios/RNDateTimePickerShadowView.m
index c139440..3e7caa9 100644
--- a/node_modules/@react-native-community/datetimepicker/ios/RNDateTimePickerShadowView.m
+++ b/node_modules/@react-native-community/datetimepicker/ios/RNDateTimePickerShadowView.m
@@ -57,7 +57,6 @@ static YGSize RNDateTimePickerShadowViewMeasure(YGNodeRef node, float width, YGM
       if (timeZone != nil) {
         [shadowPickerView.picker setTimeZone:timeZone];
       } else {
-        RCTLogWarn(@"'%@' does not exist in NSTimeZone.knownTimeZoneNames. Falling back to localTimeZone=%@", shadowPickerView.timeZoneName, NSTimeZone.localTimeZone.name);
         [shadowPickerView.picker setTimeZone:NSTimeZone.localTimeZone];
       }
     } else {

それっぽい記事を見つけましたが、現状解決していないようです。

一旦RCTLogWarnに関するパッチを削除。dateTimePickerをプロジェクト内で使ってないみたいなので、ワークスペースから削除。キャッシュ削除して再実行。

う、動いたっ!!

android編

Slider

ノート:/Users/ikko/Desktop/Test2/Cucom-App/node_modules/@react-native-community/
slider/android/src/main/java/com/reactnativecommunity/slider/ReactSliderManagerImpl.java
は推奨されないAPIを使用またはオーバーライドしています。
ノート:詳細は、-Xlint:deprecationオプションを指定して再コンパイルしてください。

Sliderのライブラリのバージョンをv4.1.12に変更すればうまくいくらしい。
動いたけど、別のエラー。

RNSafeAreaProvider

Invariant Violation: requireNativeComponent: "RNCSafeAreaProvider" was not found in the UIManager.

iOSの時と同じですね。

これに従えば良さそう。

  • android/settings.gradle

+ include ':react-native-safe-area-context'
+ project(':react-native-safe-area-context').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-safe-area-context/android')
  • android/app/build.gradle

dependencies {
+    implementation project(':react-native-safe-area-context')
    ...
}
  • android/app/src/main/java/com/[APP_NAME]/MainApplication.java

+ import com.th3rdwave.safeareacontext.SafeAreaContextPackage;
  • android/app/src/main/java/com/[APP_NAME]/MainApplication.java (Add this code where the getPackages function exists)

@Override
protected List<ReactPackage> getPackages() {
    List<ReactPackage> packages = new PackageList(this).getPackages();
    packages.add(new ModuleRegistryAdapter(mModuleRegistryProvider));
    ...
+    packages.add(new SafeAreaContextPackage());
    return packages;
}

動いた!!

感想戦

記事を書きながらエラーと戦うと、頭の中がスッキリして解決までの道のりが段違いに速くなるのを感じました。
これからはちょくちょくnoteに格闘記を投稿していきます。

この記事が気に入ったらサポートをしてみませんか?