【问题标题】:Flutter: How to implement non-standard code flow using `injectable` package?Flutter:如何使用 `injectable` 包实现非标准代码流?
【发布时间】:2022-11-08 03:23:27
【问题描述】:

假设我需要这个:

class EndpointProvider {
  String getEndpoint(String trigger) {
    // skipped for clarity
  }
}

class MyHttpClient implements BaseHttpClient {
  MyHttpClient(this.baseUrl, [String accessToken = '']);  
}

class MyRemoteDataProvider extends BaseDataProvider {
  MyRemoteDataProvider(this.httpClient)

  final BaseHttpClient httpClient;
}

目前的代码流程是:

final endpointProvider = EndpointProvider();
final endpoint = endpointProvider.getEndpoint('trigger');
final accessToken = getTokenFromStorage() ?? '';
final httpClient = MyHttpClient(endpoint.url, accessToke );
final dataProvider = MyRemoteDataProvider(httpClient);
dataProvider.do();

是否可以使用injectable 来实现这一点?

【问题讨论】:

    标签: flutter dart dependency-injection injectable


    【解决方案1】:

    你可以试试这个:

    @lazySingleton
    class EndpointProvider {
      String getEndpoint(String trigger) {
        return 'https://api.example.com/$trigger';
      }
    }
    
    @LazySingleton(as: BaseHttpClient)
    class MyHttpClient implements BaseHttpClient {
      final String baseUrl;
      MyHttpClient(EndpointProvider endpointProvider, [@Named('accessToken') String accessToken]) : baseUrl = endpointProvider.getEndpoint('my_endpoint');
    }
    
    @lazySingleton
    class MyRemoteDataProvider extends BaseDataProvider {
      MyRemoteDataProvider(this.httpClient)
    
      final BaseHttpClient httpClient;
    }
    

    在同一个可注入配置文件中,您可以放置​​:

    @module
    abstract class Module {
      @Named('accessToken')
      String get accessToken => '';
    }
    

    【讨论】:

    • 以及如何注入可选的accessToken
    • 抱歉,您可以将它添加到 getIt 作为 String 命名此行更改如下 MyHttpClient(EndpointProvider endpointProvider, [@Named('accessToken')String accessToken = ''])
    猜你喜欢
    • 1970-01-01
    • 2020-08-25
    • 2010-12-25
    • 2010-10-25
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 2019-06-19
    • 2022-01-13
    相关资源
    最近更新 更多