Область на реагирующе-нативном: не может получить результаты, когда не отлаживается
Я не могу получить результаты любого запроса, когда не отладка, но отлично работает при отладке
Также я заметил, что Realm ведет себя очень по-разному, в зависимости от того, отладка или нет
Это просто краткое изложение идеи:
Я печатаю object.constructor.name
найти тип объекта
При отладке (удаленно с помощью Chrome или Safari):
let realm = new Realm(config);
realm.constructor.name --> will print (Realm)
let dogs = realm2.objects('Dog');
dogs.constructor.name --> will print (Results)
(inserting few dogs)
for (let oneDog of dogs) {
oneDog.constructor.name --> will print (RealmObject)
} --> works perfectly
Но когда не происходит отладка, все по-другому:
let realm = new Realm(config);
realm.constructor.name --> will print (Object)
let dogs = realm2.objects('Dog');
dogs.constructor.name --> will print nothing
(inserting few dogs)
for (let oneDog of dogs) {
oneDog.constructor.name --> not compiled
} --> will give the error below
TypeError: undefined is not a function (evaluating ‘_iterator[typeof
Symbol === “function” ? Symbol.iterator : “@@iterator”]()')
Я не уверен, что это ошибка или проблема с моими кодами
Версия Царства и Инструментов
- Realm JS SDK Версия: 2.10.0
- React Native: 0.55.4
- Клиентская ОС и версия: работает на устройстве Android 8.0
- Какой отладчик для React Native: Chrome
Полный код:
import React, { Component } from 'react';
import { View, Text } from 'react-native';
const Realm = require('realm');
export default class Page3Screen extends Component {
state = { messege : 'no messege' }
componentWillMount() {
const config = {
schema: [{ name: 'Dog', properties: { name: 'string' } }],
};
let realm = new Realm(config);
console.log(realm.constructor.name);
this.setState({ messege: realm.constructor.name });
realm.write(() => {
realm.create('Dog', { name: 'Zozo' });
});
let dogs = realm.objects('Dog');
// console.log(dogs.constructor.name);
// this.setState({ messege: dogs.constructor.name });
// for (let oneDog of dogs) {
// console.log(oneDog.constructor.name);
// this.setState({ messege: oneDog.constructor.name });
// }
}
render() {
return (
<View style={{ alignSelf: 'stretch', flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>{this.state.messege}</Text>
</View>
);
}
}
2 ответа
Я обнаружил, что проблема связана с этой проблемой
По какой-то причине response-native на android поставляет старую, как дерьмовую версию JSC, ту, у которой нет поддержки языковых функций, которые должны работать в текущей версии реакции
это было решено путем обновления версии JSC, которая поставляется с Android, но я использовал версию JSC 216113 вместо последней, чтобы сохранить minSdkVersion 17 вместо 21
Вот инструкции:
Follow steps below in order for your React Native app to use new version of JSC VM on android:
1. Add `jsc-android` to the "dependencies" section in your `package.json`:
```
dependencies {
+ "jsc-android": "^216113.0.0",
```
then run `npm install` or `yarn` (depending which npm client you use) in order for the new dependency to be installed in `node_modules`
2. Modify `andorid/build.gradle` file to add new local maven repository packaged in the `jsc-android` package to the search path:
```
allprojects {
repositories {
mavenLocal()
jcenter()
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url "$rootDir/../node_modules/react-native/android"
}
+ maven {
+ // Local Maven repo containing AARs with JSC library built for Android
+ url "$rootDir/../node_modules/jsc-android/android"
+ }
}
}
```
3. Update your app's `build.gradle` file located in `android/app/build.gradle` to force app builds to use new version of the JSC library as opposed to the version specified in [react-native gradle module as a dependency](https://github.com/facebook/react-native/blob/e8df8d9fd579ff14224cacdb816f9ff07eef978d/ReactAndroid/build.gradle#L289):
```
}
+configurations.all {
+ resolutionStrategy {
+ force 'org.webkit:android-jsc:r216113'
+ }
+}
dependencies {
compile fileTree(dir: "libs", include: ["*.jar"])
```
4. You're done, rebuild your app and enjoy updated version of JSC on android!
Когда ты в debugging
В режиме response-native запускается js-код внутри вашего браузера вместо устройства. так как вы говорите, что он отлично работает в браузере, но не работает на устройстве, я предлагаю вам проверить следующее:
- проверьте, подключено ли устройство к той же сети
- запустите это:
adb reverse tcp:8081 tcp:8081
- проверьте, работает ли dev-сервер или нет, вы можете запустить его с помощью:
$ react-native start
некоторые функции JS нуждаются в polyfill-ах, таких как:
Symbol
, поэтому добавьте следующееindex.js
:import 'core-js/es6/symbol'; import 'core-js/fn/symbol/iterator';
в очень редких ситуациях у вас есть различия между движком JS в браузере и устройством Android/ IOS
удачи.