Flutter Injectable 注入第三方依赖项

问题描述 投票:0回答:3

我在使用

injectable
时如何将 http.Client 注入到 flutter 类中这个简单问题上花了几个小时。他们引用在模块中执行此操作(如本post中所建议的那样),但我也无法弄清楚。

这是我的文件(抽象类和具体类):

import 'dart:convert';

import 'package:get_it/get_it.dart';
import 'package:http/http.dart' as http;
import 'package:injectable/injectable.dart';
import 'package:myapp_flutter/core/errors/exceptions.dart';
import 'package:myapp_flutter/data/models/sample_model.dart';

abstract class ISampleRemoteDataSource {

  /// Throws a [ServerException] for all error codes.
  Future<SampleModel> getSampleModel(String activityType);
}

@Injectable(as: ISampleRemoteDataSource)
class SampleRemoteDataSourceImpl extends ISampleRemoteDataSource {
  final http.Client client;
  final baseUrl = "https://www.boredapi.com/api/activity?type=";
  final headers = {'Content-Type': 'application/json'};

  SampleRemoteDataSourceImpl({@factoryParam required this.client});

  @override
  Future<SampleModel> getSampleModel(String activityType) async {
    Uri uri = Uri.parse(baseUrl + activityType);
    GetIt.I.get<http.Client>();

    final response = await client.get(uri, headers: headers);
    if (response.statusCode == 200) {
      return SampleModel.fromJson(json.decode(response.body));
    } else {
      throw ServerException();
    }
  }
}

我认为在构造函数中将其声明为工厂参数就可以了,但我错了。将抽象类声明为模块并不能做到这一点(而且似乎也是非常错误的)。我只是不知道。

flutter dependency-injection flutter-dependencies
3个回答
1
投票

这应该有效:

首先实现一个注册模块文件

@module
abstract class RegisterModule {
//add http client
@lazySingleton
http.Client get httpClient => http.Client();
}

class $RegisterModule extends RegisterModule {}

然后,生成

injection.config.dart
文件后,您的 http 客户端应该在
initGetIt

中提及

0
投票

您必须将它们注册为模块,如下所述 https://pub.dev/packages/injectable#Registering-third-party-types


0
投票

将此类第三方类注释为模块。

@module
abstract class ServiceModule {
  @lazySingleton
  FirebaseFirestore get getStore => FirebaseFirestore.instance;
}

您可以通过以下方式访问它,

FirebaseFirestore store = GetIt.instance.get<ServiceModule>().getStore
© www.soinside.com 2019 - 2024. All rights reserved.