首页 > 解决方案 > 如何使用内置缓存在 AppSyncClient 中保留“默认”本地状态

问题描述

AWSAppSyncClient不坚持localstate。先前更新的本地状态丢失。defaults本地状态会在应用重新启动时重置。即me使用客户端突变登录后成功更新状态。重新启动应用程序后,me状态将设置回默认值Offline user

网络QueryMutation工作如预期。

apollo-persist-cache在将它传递给之前尝试过使用它,withClientState但它破坏了离线功能并引入了不一致的数据。使用自定义InMemoryCache也会破坏离线功能。

import { defaults, resolvers } from '../graphql/localstate';

// Before login
// {
//    me: {
//        __typename: 'User',
//        id: '1',
//        name: 'Offline user',
//        email: 'help@problems.com',
//        pictureUrl: null
//    },
// }

// After login
// {
//    me: {
//        __typename: 'User',
//        id: 'aws-cognito-idenitity-id',
//        name: 'Gnu user',
//        email: 'my@example.com',
//        pictureUrl: "https://s3.amazon..."
//    },
// }

const stateLink = createLinkWithCache(cache => withClientState({
    cache,
    resolvers,
    defaults
}));

const appSyncLink = createAppSyncLink({
    url: aws_config.aws_appsync_graphqlEndpoint,
    region: aws_config.aws_appsync_region,
    auth: {
      type: aws_config.aws_appsync_authenticationType,
      credentials: () => Auth.currentCredentials()
    }
});

const link = ApolloLink.from([stateLink, appSyncLink]);
const client = new AWSAppSyncClient({}, { link });
client.onResetStore(stateLink.writeDefaults);

export default client;
// Inside App.js

<ApolloProvider client={client}>
    <Rehydrated>
        <AppContainer/>
    </Rehydrated>
</ApolloProvider>

我希望AWSAppSync离线功能能够处理持久化,并使用组件localstate恢复它。aws-appsync-react Rehydrated

更新

@usmansbk 我们仍在研究 Apollo 链接状态,由于如何在标准进程之外操作缓存,SDK 目前不完全支持该状态。我们在这里有一些想法和一些原型代码,但仍需要一些时间才能完全支持。同时我们建议使用没有 Apollo Link State 的 SDK。

标签: react-nativeaws-appsync

解决方案


推荐阅读