首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用GraphQl在颤振中初始化Get_it客户机

无法使用GraphQl在颤振中初始化Get_it客户机
EN

Stack Overflow用户
提问于 2021-06-25 04:28:54
回答 1查看 605关注 0票数 5

我想在我的颤振应用程序中实现GraphQL客户端。对于依赖注入,我使用GetIt库。但是当我运行这个应用程序时,上面写着

无效参数( HomeGraphQLService类型的对象未在GetIt中注册)。你忘记传递一个实例名了吗?(你不小心做了GetIt sl=GetIt.instance();而不是GetIt sl=GetIt.instance;):HomeGraphQLService

这意味着GraphQL客户端没有以某种方式实例化,尽管我在服务定位器中注册了它。

Session.dart

代码语言:javascript
复制
abstract class Session {
  String getAccessToken();
}

SessionImpl.dart

代码语言:javascript
复制
class SessionImpl extends Session {
  SharedPreferences sharedPref;

  SessionImpl(SharedPreferences sharedPref) {
    this.sharedPref = sharedPref;
  }

  @override
  String getAccessToken() {
    return sharedPref.getString('access_token') ?? "";
  }

}

GraphQLClientGenerator.dart

代码语言:javascript
复制
class GraphQLClientGenerator {
  Session session;

  GraphQLClientGenerator(Session session) {
    this.session = session;
  }

  GraphQLClient getClient() {
    final HttpLink httpLink = HttpLink('https://xxx/graphql');
    final AuthLink authLink = AuthLink(getToken: () async => 'Bearer ${_getAccessToken()}');
    final Link link = authLink.concat(httpLink);

    return GraphQLClient(link: link, cache: GraphQLCache(store: InMemoryStore()));
  }

  String _getAccessToken() {
    return session.getAccessToken();
  }
}

HomeRepository.dart

代码语言:javascript
复制
abstract class HomeRepository {
  Future<List<Course>> getAllCourseOf(String className, String groupName);
}

HomeRepositoryImpl.dart

代码语言:javascript
复制
class HomeRepositoryImpl extends HomeRepository {

  HomeGraphQLService homeGraphQLService;
  HomeMapper homeMapper;

  HomeRepositoryImpl(HomeGraphQLService homeGraphQLService, HomeMapper homeMapper) {
    this.homeGraphQLService = homeGraphQLService;
    this.homeMapper = homeMapper;
  }

  @override
  Future<List<Course>> getAllCourseOf(String className, String groupName) async {
    final response = await homeGraphQLService.getAllCourseOf(className, groupName);
    return homeMapper.toCourses(response).where((course) => course.isAvailable);
  }

}

HomeGraphQLService.dart

代码语言:javascript
复制
class HomeGraphQLService {
  GraphQLClient graphQLClient;

  HomeGraphQLService(GraphQLClient graphQLClient) {
    this.graphQLClient = graphQLClient;
  }

  Future<SubjectResponse> getAllCourseOf(String className, String groupName) async {
    try {
      final response = await graphQLClient.query(getAllCourseQuery(className, groupName));
      return SubjectResponse.fromJson((response.data));
    }  catch (e) {
      return Future.error(e);
    }
  }
}

GraphQuery.dart

代码语言:javascript
复制
QueryOptions getAllCourseQuery(String className, String groupName) {
  String query = """
    query GetSubject($className: String, $groupName: String) {
      subjects(class: $className, group: $groupName) {
        code
        display
        insights {
          coming_soon
          purchased
        }
      }
    }
    """;

  return QueryOptions(
    document: gql(query),
    variables: <String, dynamic>{
      'className': className,
      'groupName': groupName,
    },
  );
}

ServiceLocator.dart

代码语言:javascript
复制
final serviceLocator = GetIt.instance;

Future<void> initDependencies() async {
  await _initSharedPref();
  _initSession();
  _initGraphQLClient();
  _initGraphQLService();
  _initMapper();
  _initRepository();
}

Future<void> _initSharedPref() async {
  SharedPreferences sharedPref = await SharedPreferences.getInstance();
  serviceLocator.registerSingleton<SharedPreferences>(sharedPref);
}

void _initSession() {
  serviceLocator.registerLazySingleton<Session>(()=>SessionImpl(serviceLocator()));
}

void _initGraphQLClient() {
  serviceLocator.registerLazySingleton<GraphQLClient>(() => GraphQLClientGenerator(serviceLocator()).getClient());
}

void _initGraphQLService() {
  serviceLocator.registerLazySingleton<HomeGraphQLService>(() => HomeGraphQLService(serviceLocator()));
}

void _initMapper() {
  serviceLocator.registerLazySingleton<HomeMapper>(() => HomeMapper());
}

void _initRepository() {
  serviceLocator.registerLazySingleton<HomeRepository>(() => HomeRepositoryImpl(serviceLocator(), serviceLocator()));
}

main.dart

代码语言:javascript
复制
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  SystemChrome.setPreferredOrientations(
    [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown],
  );
  
  await initDependencies();

  runApp(MyApp());
}
EN

回答 1

Stack Overflow用户

发布于 2021-06-25 05:43:25

我不能确切地说它是在哪里发生的,因为它在您的代码中访问GraphQLService的其他地方,但是问题肯定是由于延迟加载造成的。对象在被访问之前还没有被locator创建和加载。尝试更新ServiceLocator.dart以在注册期间实例化类,如下所示:

代码语言:javascript
复制
void _initSession() {
  serviceLocator.registerSingleton<Session>.(SessionImpl(serviceLocator()));
}

void _initGraphQLClient() {
  serviceLocator.registerSingleton<GraphQLClient>(
    GraphQLClientGenerator(serviceLocator()).getClient());
}

void _initGraphQLService() {
  serviceLocator.registerSingleton<HomeGraphQLService>(
    HomeGraphQLService(serviceLocator()));
}

void _initMapper() {
  serviceLocator.registerSingleton<HomeMapper>(HomeMapper());
}

void _initRepository() {
  serviceLocator.registerSingleton<HomeRepository>(
    HomeRepositoryImpl(serviceLocator(), serviceLocator()));
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68125447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档