akveo / react-native-ui-kitten

:boom: React Native UI Library based on Eva Design System :new_moon_with_face::sparkles:Dark Mode
https://akveo.github.io/react-native-ui-kitten/
MIT License
10.27k stars 951 forks source link

The app crashes when using new Hermes engine #664

Closed johanquiroga closed 4 years ago

johanquiroga commented 4 years ago

Issue type

Issue description

Current behavior:

The app crashes when using new Hermes engine.

This only happened once I added the Icons Module, before that the app was working correctly with the Hermes engine. Screenshot_1570497400

Expected behavior:

The app works with or without the Hermes engine.

Steps to reproduce:

Other information:

OS, device, package version

"@eva-design/eva": "^1.2.0"
"@ui-kitten/eva-icons": "^4.2.0"
"react-native": "0.61.1"
"react-native-ui-kitten": "^4.2.0"
artyorsh commented 4 years ago

Hi @johanquiroga 👋 I guess this is mostly not a framework issue, just because Hermes engine does not currently support Proxies. See the related thread

And yes, this is because Icons module relies on Proxies, but this was the simplest solution for us. Btw, MobX users have the same issues with Hermes.

anhtuank7c commented 4 years ago

I think we should use module proxy-polyfill for this line: https://github.com/akveo/react-native-ui-kitten/blob/05a3471c49916e8bdf8f7caaf3070b409582025e/src/eva-icons/createIconsMap.ts#L7

ie:

import PolyfillProxy from 'proxy-polyfill/src/proxy'

...
return new PolyfillProxy({}, {...})
artyorsh commented 4 years ago

@anhtuank7c does it resolves an issue?

artyorsh commented 4 years ago

@anhtuank7c I did some review on this now, and what I get is that we don't get application crashes, but for any reason it's unable to find requested property, e.g:

const HeartIcon = () => <Icon name='heart' />

will lead to runtime error of @ui-kitten/eva-icons package saying 'heart' does not exist

AndreaTurco commented 4 years ago

Hi all In my case, this issue is present only on android and my currently workaround is :

const RemoteBulbIcon = (style) => ( <Image style={style} source={{ uri: 'https://akveo.github.io/eva-icons/outline/png/128/bulb-outline.png' }} /> );

export const IconExternalSourceShowcase = (props) => (

);

icons from: (https://akveo.github.io/eva-icons/#/)

Other information:
OS, device, package version:
"@eva-design/eva": "^1.3.1",
"@ui-kitten/eva-icons": "^4.3.2",
"react-native-ui-kitten": "4.3.2",
artyorsh commented 4 years ago

@AndreaTurco the reason is that Hermes engine doesn't support proxies. This engine is used to increase Android performance, and it doesn't affect iOS in total. Currently we have no workaround to get rid of proxies, so if you really need Hermes - your solution would work, but will affect UX because of loading icons remotely instead of using SVGs.

anhtuank7c commented 4 years ago

Good news ever!!!!

https://twitter.com/HermesEngine/status/1245136667414913024

Screen Shot 2020-04-02 at 21 07 34
artyorsh commented 4 years ago

@anhtuank7c thanks for sharing 👍

lewatt23 commented 4 years ago

@anhtuank7c Please any workaround? am using react-native 0.62 but I still have this error...

anhtuank7c commented 4 years ago

@lewatt23 Did you try npm install hermes-engine@v0.4.2-rc1?

lewatt23 commented 4 years ago

@anhtuank7c My bad thought I was installed by default since I was using rn 0.62.2, just installed and is working fine, thanks :)

afkcodes commented 4 years ago

for those using 0.63 use npm install hermes-engine@v0.5.2-rc1

santiago1393 commented 3 years ago

for those using 0.63 use npm install hermes-engine@v0.5.2-rc1

It worked after clean gradle builds Thanks!!

kuasha420 commented 3 years ago

0.64 will have Proxy enabled by default on Hermes. Woohoo!

teamzz111 commented 3 years ago

for those using 0.63 use npm install hermes-engine@v0.5.2-rc1

Workssss