Dagger2 создает дубликат экземпляра интерфейса в модуле - PullRequest
1 голос
/ 27 июня 2019

Я использую dagger-android в своем приложении с аннотацией @ContributesAndroidInjector.

@Module
public abstract class ActivityBuilder {
    @ContributesAndroidInjector(modules = BleDevicesModule.class)
    abstract BleDevicesActivity bindBleDevicesActivity();
}
@Module
class BleDevicesModule {

...

@Provides
    fun provideBleObserver(bleRepository: IBluetoothRepository): IObservableUseCase<List<Device>> {
        return GetAllAvailableBleDevicesUseCase(bleRepository)
    }

    @Provides
    fun providePairDeviceUseCase(bleRepository: IBluetoothRepository): ISingleUseCaseWithParameter<Device, Boolean> {
        return ConnectDeviceUseCase(bleRepository)
    }

    @Provides
    fun provideBleRepository(bluetoothManager: BluetoothManager, context: Context,
                                      authorBleScanner: AuthorBleScanner, authProvider: IAuthProvider): IBluetoothRepository {
        return BluetoothRepository(bluetoothManager, context, authorBleScanner, authProvider)
    }
}

Я понимаю, что у меня создано 2 варианта использования, использующих зависимость IBluetoothRepository;, поэтому *Метод 1006 * вызывается дважды, и каждый раз создается новый объект BluetoothRepository со всеми его зависимостями.Как сделать объект хранилища одиночным?В качестве глупого решения я использую переменную внутри BleDevicesModule, инициализирую и возвращаю ее из provideBleRepository(), но я думаю, что должен быть более простой способ

1 Ответ

0 голосов
/ 27 июня 2019

Вы можете использовать @Singleton

@Provides
@Singleton
fun provideBleRepository(bluetoothManager: BluetoothManager, context: Context,
                                  authorBleScanner: AuthorBleScanner, authProvider: IAuthProvider): IBluetoothRepository {
    return BluetoothRepository(bluetoothManager, context, authorBleScanner, authProvider)

Для получения дополнительной информации вы можете прочитать эту документацию: Пользовательские области действия

Или другой вариант можно добавить@Singleton аннотация к вашему BluetoothRepository и затем вместо возврата нового объекта на privodeBleRepository вы просто получаете его из параметра.

...