-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
React Native: Queries not executing on v4 #3582
Comments
I am also having the same issue using 4.0.0.beta.7 where querys are stuck in a loading state. It looks like they never calling the query function. I created a repo that reproduces this issue on react native as well as an equivalent code sandbox for web that does not have this issue |
I can exactly confirm this issue, which I already tried to investigate with @TkDodo . The last working version of RQ was v4 alpha 24. But you guys are reporting iOS as well, but for me only android was breaking while iOS works just fine |
Well, at first my iOS version was also still working. After a clean app install this issue was also happening on iOS. And if you create a fresh react-native project, you will see it happening on both iOS and Android. |
So what we changed was to switch to useSyncExternalStore for our subscriptions. If the query never fires (= there is no request that reaches the backend), that likely means that the subscription wasn't created for some reason. It would be good to inspect the number of observers for each query. If they are zero, that would confirm my theory. Maybe you can do that via the devtools, or via simply inspecting / logging from the queryClient. Also, can someone try with RN 0.69 RC, which supports react18. With react17, we fall back to the uSES shim, so behavior could be different: |
RN 0.69 won't be an option for Expo users for at least 3-6 months. This is usually the period updates will be shipped, and a really big user base does stick with Expo. We really need to figure this out. I will check the observers with flipper and report back. |
@hirbod you mentioned that things were working fine for you on RN 0.64.3, and the issue first showed up when you updated to RN 0.68.1 OP says things are also faulty with 0.64. can we try to narrow down if there is a version of RN that works with the current beta? |
That is true, for me the issues showed up when I upgraded. OP also said that iOS was working fine after upgrade but stopped working after clean install (which I didn't for iOS but for Android). Looks like that the beta isn't working at all with the current RN versions. (0.69 not tested, since I am also an Expo user) |
@TkDodo I've upgraded and you're right, no observers. |
@hirbod the observers are subscribed when useSyncExternalStore picks up a change. The subscription also triggers the first fetch. It should happen here: Could you check if it's called at all, or if the isRestoring check has something to do with it? It could be a bug in the uSES shim if the function is not invoked at all. We're also not on the latest uSES version, maybe we should try upgrading |
@TkDodo looks like its never calling it. I was not able to reach neither "undefined" or the isRestoring is always "false" |
I forced
|
Can you try out if other hooks that subscribe via uSES work? For example: one button that does queryClient.fetchQuery, and somewhere else a component that does useIsFetching(); the count should change when you click the button. Make sure the useIsFetching component is in a different part if the component tree that would not rerender top-down when the button is clicked. |
This line in import { useSyncExternalStore } from "use-sync-external-store/shim/index.js" If you change it to following, it works: import { useSyncExternalStore } from "use-sync-external-store/shim" The The code of 'use strict';
if (process.env.NODE_ENV === 'production') {
module.exports = require('../cjs/use-sync-external-store-shim.production.min.js');
} else {
module.exports = require('../cjs/use-sync-external-store-shim.development.js');
} The code of 'use strict';
if (process.env.NODE_ENV === 'production') {
module.exports = require('../cjs/use-sync-external-store-shim.native.production.min.js');
} else {
module.exports = require('../cjs/use-sync-external-store-shim.native.development.js');
} So it doesn't work because the code isn't importing the React Native specific implementation. I added a log here and it doesn't get called when using Here is a video showing that this change works: Kapture.2022-05-09.at.00.29.14.mp4I see that this change was made in #3561 for ESM, so I guess the fix would be for React to add a My test code: expo init testapp
cd testapp
yarn add react-query@4.0.0-beta.7 And paste the following in import { Text, View } from 'react-native';
import { QueryClient, QueryClientProvider, useQuery } from 'react-query';
export default function App() {
const queryClient = new QueryClient();
return (
<QueryClientProvider client={queryClient}>
<Test />
</QueryClientProvider>
);
}
function Test() {
// Queries
const query = useQuery(['test'], {
queryFn: async () => {
console.log("this should log but doesn't");
return Promise.resolve('ok');
},
});
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Status: {query.status} </Text>
<Text>Data: {query.data} </Text>
</View>
);
} |
That would mean that beta.5 release should still work (pre esm bundling, but with uSES). @hirbod can you try that please? |
@sachinraja can we go back to not including |
Seems to be a miscommunication then. Further above, in this comment, you mentioned that:
beta.1 introduced the uSES, but beta.7 introduced the full-path import. Seems like we have to revert that, or find a better solution to the initial issue, which was: @latin-1 fyi |
That was just the assumption after you asked me to downgrade to that version. Anyway, we have found the root cause :). |
@TkDodo Conditional exports in |
Conditional exports are for Node afaik and not going to work with RN. I think the best solution is to add a |
@satya164 facebook/metro#670 Yes you are correct. Conditional exports is not yet supported. |
React is really putting us in a difficult place here. If uSES doesn't work with that import I suspect our Does someone familiar with RN bundling know if it supports or prefers the |
Ok I have an idea on how to fix this. We can do a separate build without extensions (like we were doing before) and use the |
Why not fix it in You also don't need a separate build without an extension or a |
Because we have no control over that package. @latin-1 does have a PR open at facebook/react#24440 which I've left a comment in, so hopefully this gets resolved.
We cannot do that. In ESM imports, you must specify the extension. |
Yeah but imo it'd better to see if React team doesn't want to fix this first since it's an issue in that package, not necessarily in React Query. Probably they will after your comment.
As far as I see all other files are imported like that - for example in the first import is |
Ah ok I see what you're saying now. Yes that would be much simpler. I didn't realize React Native doesn't resolve the esm files. |
I think the import should be corrected by RQ for now. Even if the issue is fixed upstream, the problem is that many major platforms and SDKs like Expo always ship a fixed version of React. Current version 17.0.2. If we rely only on upstream now, we run the risk of error messages continuing to come in regarding this, users overlooking the fix, and RQ having to point to a specific React version. I think we should import it the suggested way from @satya164 |
@hirbod can you make a PR with that suggestion? |
The issue is in use-sync-external-store package though, which is separate from React and can be updated to latest version. |
True, haven't thought about it. I think we can fix it for now and revert when upstream is ready. |
🎉 This issue has been resolved in version 4.0.0-beta.10 🎉 The release is available on: Your semantic-release bot 📦🚀 |
@sachinraja FYI, the newer react PR for this is here: facebook/react#25231 Doesn't seem to have gotten much love 😞 |
Describe the bug
Hi,
I'm trying out 4.0.0-beta.7 to implement offline support in our application.
Everything is upgraded including all the breaking changes, but my queries are not being executed anymore.
To be sure it's not a problem inside my application, I've created a fresh expo app with just the App.tsx file.
When opening the app, my queries remain in a loading state. If I use the refetch of the
useQuery
, and run this in auseEffect
, I'm able to execute the query.Your minimal, reproducible example
Couldn't get react-query to work in expo snack
Steps to reproduce
Expected behavior
I expect this query to be executed. If I change my package.json to the latest v3 version, my query get's executed as it should.
How often does this bug happen?
Every time
Screenshots or Videos
No response
Platform
react-query version
4.0.0-beta.7
TypeScript version
No response
Additional context
No response
The text was updated successfully, but these errors were encountered: