Динамический BaseUrl и токен при модернизации в шаблоне репозитория с рукояткой ⇐ Android
-
Anonymous
Динамический BaseUrl и токен при модернизации в шаблоне репозитория с рукояткой
Я использую модернизацию в своем проекте Android для использования веб-сервиса. в проекте необходимо ввести URL-адрес сервера, чтобы убедиться, что URL-адрес правильный. Итак, нам нужно получить экземпляр модификации, с которым пользователь ввел baseUrl, и вызвать функцию, чтобы получить специальный ответ. после этого мне нужно сохранить URL-адрес в dataStore и прочитать его при запуске приложения в будущем. также мне нужно добавить заголовок токена в качестве перехватчика, когда он вошел в приложение. Моя проблема возникает, когда я запускаю приложение, hilt автоматически создает экземпляр модификации без нового URL-адреса. как я могу это исправить?
@Module @InstallIn(ViewComponent::класс) объект NetworkModule { @Обеспечивает весело обеспечитьДооснащение( dataStoreHelper: DataStoreHelper ): Модернизация { вернуть Retrofit.Builder() .baseUrl(getBaseUrl(dataStoreHelper)) .addConverterFactory(GsonConverterFactory.create(getGson())) .client(tokenInterceptor(dataStoreHelper)) .строить() } @Обеспечивает весело getBaseUrl(dataStoreHelper: DataStoreHelper): String { вар URL: Строка? = ноль runBlocking { URL = dataStoreHelper.getFirstPreferences(DataStoreConstant.BASE_URL, "http://127.0.0.1") } вернуть URL!! } @Обеспечивает весело обеспечитьServerMetaApi (модернизация: Модернизация): ServerMetaApi { возвратная модификация .create(ServerMetaApi::class.java) } @Обеспечивает весело обеспечитьServerRepository (api: ServerMetaApi): ServerMetaRepository { вернуть ServerMetaRepositoryImpl (api) } } @Composable забавный ConnectionScreen( навконтроллер: Навконтроллер, viewModel: ServerMetaViewModel = hiltViewModel() ) { конфигурация val = LocalConfiguration.current контекст val = LocalContext.current val uiState: State от lazy { viewModel.serverInfoUiState } val urlState = помните {mutableStateOf("") } val onCheckServerClick: () -> Unit = { runBlocking { DataStoreHelper(контекст).putPreferences( DataStoreConstant.BASE_URL, ComposeUtils.toUrl(urlState.value) ) } viewModel.getServerInfo(urlState.value) } @Composable личное развлечение ConnectionScreenContent( urlState: MutableState, onCheckServerClick: () -> Единица, uiState: State ) { Столбец( модификатор = Модификатор .fillMaxWidth() ) { UrlTextField (состояние = urlState, метка = «URL») FullWidthButton( модификатор = Modifier.align(Alignment.CenterHorizontally), label = "Проверить сервер", включено = ComposeUtils.isValidUrl(urlState.value) && !uiState.value.isLoading, onClick = onCheckServerClick ) если (uiState.value.isLoading) { Spacer(модификатор = Modifier.height(6.dp)) ЦиркулярПрогрессИндикатор( модификатор = Modifier.align(Alignment.CenterHorizontally) ) } } } uiState.value.errors?.let { it.forEach {ошибка -> Toast.makeText(context, error.description, Toast.LENGTH_SHORT).show() } } uiState.value.data?.let { // когда приходят данные // проверяем данные и делаем что-нибудь }
Я использую модернизацию в своем проекте Android для использования веб-сервиса. в проекте необходимо ввести URL-адрес сервера, чтобы убедиться, что URL-адрес правильный. Итак, нам нужно получить экземпляр модификации, с которым пользователь ввел baseUrl, и вызвать функцию, чтобы получить специальный ответ. после этого мне нужно сохранить URL-адрес в dataStore и прочитать его при запуске приложения в будущем. также мне нужно добавить заголовок токена в качестве перехватчика, когда он вошел в приложение. Моя проблема возникает, когда я запускаю приложение, hilt автоматически создает экземпляр модификации без нового URL-адреса. как я могу это исправить?
@Module @InstallIn(ViewComponent::класс) объект NetworkModule { @Обеспечивает весело обеспечитьДооснащение( dataStoreHelper: DataStoreHelper ): Модернизация { вернуть Retrofit.Builder() .baseUrl(getBaseUrl(dataStoreHelper)) .addConverterFactory(GsonConverterFactory.create(getGson())) .client(tokenInterceptor(dataStoreHelper)) .строить() } @Обеспечивает весело getBaseUrl(dataStoreHelper: DataStoreHelper): String { вар URL: Строка? = ноль runBlocking { URL = dataStoreHelper.getFirstPreferences(DataStoreConstant.BASE_URL, "http://127.0.0.1") } вернуть URL!! } @Обеспечивает весело обеспечитьServerMetaApi (модернизация: Модернизация): ServerMetaApi { возвратная модификация .create(ServerMetaApi::class.java) } @Обеспечивает весело обеспечитьServerRepository (api: ServerMetaApi): ServerMetaRepository { вернуть ServerMetaRepositoryImpl (api) } } @Composable забавный ConnectionScreen( навконтроллер: Навконтроллер, viewModel: ServerMetaViewModel = hiltViewModel() ) { конфигурация val = LocalConfiguration.current контекст val = LocalContext.current val uiState: State от lazy { viewModel.serverInfoUiState } val urlState = помните {mutableStateOf("") } val onCheckServerClick: () -> Unit = { runBlocking { DataStoreHelper(контекст).putPreferences( DataStoreConstant.BASE_URL, ComposeUtils.toUrl(urlState.value) ) } viewModel.getServerInfo(urlState.value) } @Composable личное развлечение ConnectionScreenContent( urlState: MutableState, onCheckServerClick: () -> Единица, uiState: State ) { Столбец( модификатор = Модификатор .fillMaxWidth() ) { UrlTextField (состояние = urlState, метка = «URL») FullWidthButton( модификатор = Modifier.align(Alignment.CenterHorizontally), label = "Проверить сервер", включено = ComposeUtils.isValidUrl(urlState.value) && !uiState.value.isLoading, onClick = onCheckServerClick ) если (uiState.value.isLoading) { Spacer(модификатор = Modifier.height(6.dp)) ЦиркулярПрогрессИндикатор( модификатор = Modifier.align(Alignment.CenterHorizontally) ) } } } uiState.value.errors?.let { it.forEach {ошибка -> Toast.makeText(context, error.description, Toast.LENGTH_SHORT).show() } } uiState.value.data?.let { // когда приходят данные // проверяем данные и делаем что-нибудь }
Мобильная версия