kanzitelli / expo-starter

🦥 Expo Starter - Powered by Expo SDK, Navio (React Navigation), RN UI lib, MMKV, Mobx, Reanimated 2, Dark Mode, Localization, and much more.
https://starters.dev
396 stars 52 forks source link

Mobx frozen Error #16

Closed emrahc closed 2 years ago

emrahc commented 2 years ago

I am not sure if its right place to ask that error. I have a local file link mobx persisted state. A image component gets that file link from mobx state. But application crashes. I have tried with both vanilla rn image component and rnuilib image component.

Error: [MobX] Observable arrays cannot be frozen

This error is located at:
    in RCTImageView
    in Image (created by wrappedComponent)
    in RCTView (created by View)
    in View (created by AnimatedComponent)
    in AnimatedComponent
    in AnimatedComponentWrapper (created by TouchableOpacity)
    in TouchableOpacity
    in Unknown (created by TouchableOpacity)
    in TouchableOpacity (created by TouchableOpacity)
    in TouchableOpacity (created by TouchableOpacity)
    in TouchableOpacity (created by TouchableOpacity)
    in TouchableOpacity (created by wrappedComponent)
    in RCTView (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by wrappedComponent)
    in RCTView (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by wrappedComponent)
    in wrappedComponent (created by Match)
    in RCTView (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by Match)
    in ViewManagerAdapter_ExpoLinearGradient
    in Adapter<ExpoLinearGradient> (created by LinearGradient)
    in LinearGradient (created by _c)
    in RCTView (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by _c)
    in RCTScrollContentView (created by ScrollView)
    in RCTScrollView (created by ScrollView)
    in ScrollView (created by ScrollView)
    in ScrollView (created by NativeViewGestureHandler)
    in NativeViewGestureHandler (created by ScrollView)
    in ScrollView (created by _c)
    in _c (created by Match)
    in Match (created by SceneView)
    in StaticContainer
    in EnsureSingleNavigator (created by SceneView)
    in SceneView (created by SceneView)
    in RCTView (created by View)
    in View (created by DebugContainer)
    in DebugContainer (created by MaybeNestedStack)
    in MaybeNestedStack (created by SceneView)
    in RNSScreen (created by AnimatedComponent)
    in AnimatedComponent
    in AnimatedComponentWrapper (created by Screen)
    in MaybeFreeze (created by Screen)
    in Screen (created by SceneView)
    in SceneView (created by NativeStackViewInner)
    in RNSScreenStack (created by ScreenStack)
    in ScreenStack (created by NativeStackViewInner)
    in NativeStackViewInner (created by NativeStackView)
    in RCTView (created by View)
    in View (created by SafeAreaInsetsContext)
    in SafeAreaProviderCompat (created by NativeStackView)
    in NativeStackView (created by NativeStackNavigator)
    in NativeStackNavigator (created by HomeStack)
    in HomeStack (created by SceneView)
    in StaticContainer
    in EnsureSingleNavigator (created by SceneView)
    in SceneView (created by SceneView)
    in RCTView (created by View)
    in View (created by DebugContainer)
    in DebugContainer (created by MaybeNestedStack)
    in MaybeNestedStack (created by SceneView)
    in RNSScreen (created by AnimatedComponent)
    in AnimatedComponent
    in AnimatedComponentWrapper (created by Screen)
    in MaybeFreeze (created by Screen)
    in Screen (created by SceneView)
    in SceneView (created by NativeStackViewInner)
    in RNSScreenStack (created by ScreenStack)
    in ScreenStack (created by NativeStackViewInner)
    in NativeStackViewInner (created by NativeStackView)
    in RNCSafeAreaProvider (created by SafeAreaProvider)
    in SafeAreaProvider (created by SafeAreaInsetsContext)
    in SafeAreaProviderCompat (created by NativeStackView)
    in NativeStackView (created by NativeStackNavigator)
    in NativeStackNavigator (created by RootNavigator)
    in RootNavigator (created by AppNavigator)
    in EnsureSingleNavigator
    in BaseNavigationContainer
    in ThemeProvider
    in NavigationContainerInner (created by AppNavigator)
    in AppNavigator
    in ServicesProvider
    in StoresProvider
    in RCTView (created by View)
    in View (created by GestureHandlerRootView)
    in GestureHandlerRootView
    in Unknown (created by ExpoRoot)
    in ExpoRoot
    in RCTView (created by View)
    in View (created by AppContainer)
    in RCTView (created by View)
    in View (created by AppContainer)
    in AppContainer, js engine: hermes
- ... 32 more stack frames from framework internals`
Warning: Failed prop type: Invalid prop `source` supplied to `Image`.
    at Image (http://192.168.28.85:8081/node_modules/expo/AppEntry.bundle?platform=ios&dev=true&hot=false&minify=false:68764:42)
    in wrappedComponent (created by Match)
    in RCTView (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by Match)
    in ViewManagerAdapter_ExpoLinearGradient
    in Adapter<ExpoLinearGradient> (created by LinearGradient)
    in LinearGradient (created by _c)
    in RCTView (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by View)
    in View (created by _c)
    in RCTScrollContentView (created by ScrollView)
    in RCTScrollView (created by ScrollView)
    in ScrollView (created by ScrollView)
    in ScrollView (created by NativeViewGestureHandler)
    in NativeViewGestureHandler (created by ScrollView)
    in ScrollView (created by _c)
    in _c (created by Match)
    in Match (created by SceneView)
    in StaticContainer
    in EnsureSingleNavigator (created by SceneView)
    in SceneView (created by SceneView)
    in RCTView (created by View)
    in View (created by DebugContainer)
    in DebugContainer (created by MaybeNestedStack)
    in MaybeNestedStack (created by SceneView)
    in RNSScreen (created by AnimatedComponent)
    in AnimatedComponent
    in AnimatedComponentWrapper (created by Screen)
    in MaybeFreeze (created by Screen)
    in Screen (created by SceneView)
    in SceneView (created by NativeStackViewInner)
    in RNSScreenStack (created by ScreenStack)
    in ScreenStack (created by NativeStackViewInner)
    in NativeStackViewInner (created by NativeStackView)
    in RCTView (created by View)
    in View (created by SafeAreaInsetsContext)
    in SafeAreaProviderCompat (created by NativeStackView)
    in NativeStackView (created by NativeStackNavigator)
    in NativeStackNavigator (created by HomeStack)
    in HomeStack (created by SceneView)
    in StaticContainer
    in EnsureSingleNavigator (created by SceneView)
    in SceneView (created by SceneView)
    in RCTView (created by View)
    in View (created by DebugContainer)
    in DebugContainer (created by MaybeNestedStack)
    in MaybeNestedStack (created by SceneView)
    in RNSScreen (created by AnimatedComponent)
    in AnimatedComponent
    in AnimatedComponentWrapper (created by Screen)
    in MaybeFreeze (created by Screen)
    in Screen (created by SceneView)
    in SceneView (created by NativeStackViewInner)
    in RNSScreenStack (created by ScreenStack)
    in ScreenStack (created by NativeStackViewInner)
    in NativeStackViewInner (created by NativeStackView)
    in RNCSafeAreaProvider (created by SafeAreaProvider)
    in SafeAreaProvider (created by SafeAreaInsetsContext)
    in SafeAreaProviderCompat (created by NativeStackView)
    in NativeStackView (created by NativeStackNavigator)
    in NativeStackNavigator (created by RootNavigator)
    in RootNavigator (created by AppNavigator)
    in EnsureSingleNavigator
    in BaseNavigationContainer
    in ThemeProvider
    in NavigationContainerInner (created by AppNavigator)
    in AppNavigator
    in ServicesProvider
    in StoresProvider
    in RCTView (created by View)
    in View (created by GestureHandlerRootView)
    in GestureHandlerRootView
    in Unknown (created by ExpoRoot)
    in ExpoRoot
    in RCTView (created by View)
    in View (created by AppContainer)
    in RCTView (created by View)
    in View (created by AppContainer)
    in AppContainer
at node_modules/react/cjs/react-jsx-runtime.development.js:117:4 in printWarning
at node_modules/react/cjs/react-jsx-runtime.development.js:93:16 in error
at node_modules/react/cjs/react-jsx-runtime.development.js:620:15 in checkPropTypes
at node_modules/react/cjs/react-jsx-runtime.development.js:1072:20 in validatePropTypes
at node_modules/react/cjs/react-jsx-runtime.development.js:1192:23 in jsxWithValidation
at node_modules/react/cjs/react-jsx-runtime.development.js:1209:28 in jsxWithValidationDynamic
at http://192.168.28.85:8081/node_modules/expo/AppEntry.bundle?platform=ios&dev=true&hot=false&minify=false:299210:42 in anonymous
at node_modules/mobx-react-lite/es/observer.js:24:61 in useObserver$argument_0
at node_modules/mobx-react-lite/es/useObserver.js:111:26 in reaction.track$argument_0
- ... 28 more stack frames from framework internals

Previously i was using redux toolkit, it was working fine. Then i moved expo-starter. Now crashes.

kanzitelli commented 2 years ago

Hey @emrahc. I doubt It has something to do with expo-starter as it's just a convenient way of organising the project structure.

What I can see from logs is that source property of Image is not correct. It may have many causes, so it would be helpful if you provided some code.

Also, if you use MobX arrays somewhere inside a component, make sure you do data.slice().

emrahc commented 2 years ago

I have user store there is photoUri state of user.

const state: UserState = {
  user: null,
  lang: 'en',
  photoUri: null,
  token: null,
};

I have a main screen component User can see their photo with "photoUri" state. There is match screen. In match screen user sees image with 'photoUri' state. That screen crashes sometimes with the error above

export const Match: React.FC = observer(() => {
  const { nav } = useServices()
  const [selectHoroscope, setSelectHoroscope] = useState(false);
  const { analysis: {
    partnerMatch,
    partnerPhotoSelectMode,
    state: {
      partnerHoroscope, partnerPhoto
    }
  },
    user: { state: { photoUri } } } = useStores()

  React.useEffect(() => {
    partnerMatch({ points: null, partnerPhoto: null })

  }, []);

  return (
    <Container scroll={true}>
      <View centerV flex spread paddingHorizontal={"5%"}>

               <Image
              source={{ uri: photoUri }}
              style={{
                width: widthToPercentage(30),
                height: widthToPercentage(30),
                borderRadius: 100,
              }}
            />       
      <View flex center>
          {(!partnerHoroscope && !partnerPhoto) && (
            <Card
              onPress={() => nav.replace("MatchFamous", { isMostFamous: true })}
              borderRadius={18}
              width="90%"
              flex
              centerH
              containerStyle={{
                flex: 1 / 2,
                backgroundColor: Colors.primaryGrey,
              }}
            >
              <Image
                source={require("../../../assets/images/FamousStar.png")}
                style={{
                  marginTop: "-10%",
                  // flex: 1,
                }}
              />
              <Spacer pt={2} />
              <Text white>FAMOUS PEOPLE MATCH</Text>
            </Card>
          )}
        </View>
        {partnerPhoto && !partnerHoroscope && !selectHoroscope && (
          <Button
            medium
            label="Select Partner Zodiac"
            onPress={() => setSelectHoroscope(!selectHoroscope)}
          />
        )}
      </View>
      <Spacer pt={3} />

      <PhotoModalPartner />

    </Container>
  );
});

export default Match;

There is also third screen Famous screen. It loads image from asset folder(require) and another photo with photoUri state. That screen crashes every time with the error above.

I have tried with observer wrapper or without it. Nothing changed. Thanks for help

I also tried wrapping image component but still not working.

{photoUri && <Image/>} Thanks for help

kanzitelli commented 2 years ago

Hey @emrahc! From what I can see, I would recommend to set photoUri some default value (some kind of placeholder). Also, try to console.log the photoUri value, just for checking, maybe you'll see something strange. And of course, make sure your require paths do exist. Let me know how it goes.