【问题标题】:ApolloProvider was not passed a client instance - React NativeApolloProvider 未传递客户端实例 - React Native
【发布时间】:2020-02-26 10:43:01
【问题描述】:

我已经使用 GraphQL 设置了我的 React Native 应用程序。一旦我开始新项目并使用 react native 遵循 graphql 的设置,我得到了这个错误。

ApolloProvider 未传递客户端实例。确保你通过 client 属性传入你的客户端

我从上到下一直关注这个documentation

apollo.js

import {HttpLink} from 'apollo-link-http';
import {ApolloClient} from 'apollo-client';
import {InMemoryCache} from 'apollo-cache-inmemory';

const makeApolloClient = token => {
  // create an apollo link instance, a network interface for apollo client
  const link = new HttpLink({
    uri: `https://learn.hasura.io/graphql`,
    headers: {
      Authorization: `Bearer ${token}`,
    },
  });
  // create an inmemory cache instance for caching graphql data
  const cache = new InMemoryCache();
  // instantiate apollo client with apollo link instance and cache instance
  const client = new ApolloClient({
    link,
    cache,
  });
  return client;
};
export default makeApolloClient;

App.js

import React from 'react';
import AppContainer from '../routes/Routes';
import AsyncStorage from '@react-native-community/async-storage';
import {ApolloProvider} from 'react-apollo';
import makeApolloClient from '../apollo/apollo';

console.disableYellowBox = true;

class App extends React.Component {
  state = {
    client: null,
  };

  async componentDidMount() {
    // fetch session
    const session = await AsyncStorage.getItem('@todo-graphql:session');
    const sessionObj = JSON.parse(session);
    const {token, id} = sessionObj;
    // make apollo client with this session token
    const client = makeApolloClient(token);
    // start emitting events saying that the useri s online
    this.setState({client});
  }

  render() {
    return (
      <ApolloProvider client={this.state.client}>
        <AppContainer />
      </ApolloProvider>
    );
  }
}

export default App;

错误

"apollo-cache-inmemory": "^1.6.3",
"apollo-client": "^2.6.4",
"apollo-link-http": "^1.5.16",
"react": "16.9.0",
"react-apollo": "^3.1.3",
"react-native": "0.61.3",

【问题讨论】:

    标签: react-native graphql apollo react-apollo apollo-client


    【解决方案1】:

    Render 在 componentDidMount 之前被调用。因此,客户端实例在第一次渲染期间将为空。这会导致错误。修改你的渲染方法为

    render() {
      if(!this.state.client) {
        return <Text>Loading</Text>
      }
      return (
          <ApolloProvider client={this.state.client}>
            <AppContainer />
          </ApolloProvider>
        );
    }
    

    【讨论】:

    • 感谢您的宝贵时间!但你的回答只给了我加载文本。它不会返回 AppContainer。与此相同,我添加了活动指示器。它只加载但不返回应用程序
    猜你喜欢
    • 2020-03-05
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2013-02-21
    • 2010-11-05
    • 1970-01-01
    相关资源
    最近更新 更多