小编CJR*_*CJR的帖子

Jetpack Compose:文本字段不会因外部点击而失去焦点

我正在尝试在我的 Compose 应用程序中实现搜索栏。我有一个文本字段,当我在文本字段外部单击时,我想失去焦点并隐藏键盘。但是,我不知道该怎么做。我确实尝试过这样做,我在 GitHub 上看到了这一点。

不过,我做了一些改变。原始解决方案使用了这部分代码 isHintDisplayed = it != FocusState.Active,但似乎已被弃用。所以我把它改成了isHintDisplayed = it.isFocused != true理论上应该做同样的事情。如果我恢复到旧版本的 compose 并使用 FocusState.Active,焦点/取消焦点可以完美工作,但我无法让它与我的代码一起使用。

有任何想法吗?

这是我的代码:

@Composable
fun ListScreen(
    navController: NavController
) {
    Surface(
        color = MaterialTheme.colors.background,
        modifier = Modifier.fillMaxSize()
    ) {
        Column {
            Spacer(modifier = Modifier.height(20.dp))
            Image(
                painter = painterResource(id = R.drawable.ic_international_pok_mon_logo),
                contentDescription = "Cards",
                modifier = Modifier
                    .fillMaxWidth()
                    .align(CenterHorizontally)
            )
            SearchBar(
                hint = "Search",
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(16.dp)
            ) {

            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是搜索栏:

@Composable
fun SearchBar(
    modifier: Modifier …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-compose android-compose-textfield

10
推荐指数
1
解决办法
9145
查看次数

错误:[Dagger/DuplicateBindings] com.example.StartRouter 被绑定多次?

我有课StartRouter。我想为每个活动提供此类的不同实例,并只要活动处于活动状态就保持活动状态(为此我所做的@ActivityScope)。

\n\n

问题是它在我的代码中没有这样做。看起来 dagger 为每个注释提供了一个实例,在我的例子中,一次为@ActivityScope. 该瞄准镜是定制的匕首瞄准镜。

\n\n

这是我的两个模块(每个活动一个),第一个模块:

\n\n
@Module\npublic class SplashModule {\n\n    @Provides\n    SplashVMFactory splashVMFactory(StartRouter startRouter){\n        return new SplashVMFactory(startRouter);\n\n\n    @Provides\n    StartRouter startRouter(){\n        return new StartRouter();\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

第二个模块:

\n\n
@Module\npublic class QuestionModule {\n\n    @Provides\n    QuestionVMFactory questionVMFactory(StartRouter startRouter){\n        return new QuestionVMFactory(startRouter);\n    }\n\n    @Provides\n    StartRouter startRouter(){\n        return new StartRouter();\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我有这个:

\n\n
@Module\npublic abstract class BinderModule {\n\n    @ActivityScope\n    @ContributesAndroidInjector(modules = SplashModule.class)\n    abstract SplashActivity bindSplashActivity();\n\n    @ActivityScope\n    @ContributesAndroidInjector(modules = QuestionModule.class)\n    abstract QuestionActivity bindQuestionActivity();\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的应用程序组件:

\n\n …

android dagger dagger-2

5
推荐指数
1
解决办法
8689
查看次数

ANDROID:org.gradle.api.GradleException:找不到满足版本约束的“org.jetbrains.kotlin:kotlin-stdlib”版本

我尝试运行一个测试类,并发现了下面的构建错误。它仅在尝试运行测试时出现,而不是在构建和运行应用程序时出现。关于如何解决这个问题有什么建议吗?我根本没有在我的应用程序中使用 kotlin。

org.gradle.api.internal.tasks.TaskDependencyResolveException: Could not determine the dependencies of task ':app:preDebugAndroidTestBuild'.
    at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.getDependencies(CachingTaskDependencyResolveContext.java:68)
    at org.gradle.execution.plan.TaskDependencyResolver.resolveDependenciesFor(TaskDependencyResolver.java:46)
    at org.gradle.execution.plan.LocalTaskNode.getDependencies(LocalTaskNode.java:106)
    at org.gradle.execution.plan.LocalTaskNode.resolveDependencies(LocalTaskNode.java:79)
    at org.gradle.execution.plan.DefaultExecutionPlan.addEntryTasks(DefaultExecutionPlan.java:167)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.addEntryTasks(DefaultTaskExecutionGraph.java:139)
    at org.gradle.execution.TaskNameResolvingBuildConfigurationAction.configure(TaskNameResolvingBuildConfigurationAction.java:48)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:57)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$200(DefaultBuildConfigurationActionExecuter.java:26)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter$2.proceed(DefaultBuildConfigurationActionExecuter.java:63)
    at org.gradle.execution.DefaultTasksBuildExecutionAction.configure(DefaultTasksBuildExecutionAction.java:44)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:57)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$200(DefaultBuildConfigurationActionExecuter.java:26)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter$2.proceed(DefaultBuildConfigurationActionExecuter.java:63)
    at org.gradle.execution.ExcludedTaskFilteringBuildConfigurationAction.configure(ExcludedTaskFilteringBuildConfigurationAction.java:47)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:57)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$200(DefaultBuildConfigurationActionExecuter.java:26)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.run(DefaultBuildConfigurationActionExecuter.java:43)
    at org.gradle.internal.Factories$1.create(Factories.java:25)
    at org.gradle.api.internal.project.DefaultProjectStateRegistry.withLenientState(DefaultProjectStateRegistry.java:132)
    at org.gradle.api.internal.project.DefaultProjectStateRegistry.withLenientState(DefaultProjectStateRegistry.java:124)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.select(DefaultBuildConfigurationActionExecuter.java:39)
    at org.gradle.initialization.DefaultGradleLauncher$CalculateTaskGraph.run(DefaultGradleLauncher.java:333)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:301)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:293)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
    at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
    at org.gradle.initialization.DefaultGradleLauncher.constructTaskGraph(DefaultGradleLauncher.java:218)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:155)
    at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:134)
    at org.gradle.internal.invocation.GradleBuildController$1.execute(GradleBuildController.java:58)
    at org.gradle.internal.invocation.GradleBuildController$1.execute(GradleBuildController.java:55)
    at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:82)
    at …
Run Code Online (Sandbox Code Playgroud)

android kotlin build.gradle android-gradle-plugin

3
推荐指数
1
解决办法
2916
查看次数

将 Firebase Task<Void> 包装到 RxJava CompletableEmitter 中?

我正在尝试将Firestore 方法包装到 CompletableEmitter 中,以便能够在成功/完成时返回 Completable.complete() ,在失败时返回 Completable.error() 。(该任务是一个 Firestore 操作,用于更新集合中的文档(该文档中的 1 个字段))

firestore method我试图包装成一个返回Task<Void>. 这是未将其包装在 Completable 中的代码:

public static Completable updateDocument(DocumentReference ref, Map<String,Object> fieldsAndValues){
    ref.update(fieldsAndValues)
                .addOnSuccessListener(aVoid -> {
                    Timber.d("SUCCESS");
                }).addOnCompleteListener(task -> {
                    Timber.d("COMPLETE");
                }).addOnFailureListener(e -> {
                    Timber.d("ERROR");
                });
        return Completable.complete();    //just for the sake of returning complete to finish the method...
}
Run Code Online (Sandbox Code Playgroud)

上面的代码按原样执行。

这是我尝试包装该代码:

public static Completable updateDocument(DocumentReference ref, Map<String,Object> fieldsAndValues){
    return Completable.create(emitter -> ref.update(fieldsAndValues)
       .addOnSuccessListener(aVoid -> emitter.onComplete())
       .addOnCompleteListener(task -> emitter.onComplete())
       .addOnFailureListener(emitter::onError)); …
Run Code Online (Sandbox Code Playgroud)

android firebase rx-java rx-java2 google-cloud-firestore

3
推荐指数
1
解决办法
1698
查看次数

使用 HILT 提供领域层 UseCase 类

我正在将Google I/O 的应用程序中的一些架构设计实现到我自己的应用程序中,但我在他们的应用程序中遇到了一些让我感到困惑的东西。

它们有一个带有存储库用例的域层,我通常在我的应用程序中使用它。但是,我确实必须在我的应用程序中为这些用例提供 dagger。但在 Google 的 I/O 应用程序上,我找不到任何提供这些用例的模块。当与注释 @HiltViewModel 的视图模型一起使用时(在我自己的应用程序中),它似乎有效?不知何故,这些被注入到我的视图模型中。我确实必须使用 Hilt 提供所有用例的依赖项(存储库等),但我不必通过 Hilt 提供任何用例。

这是它在我的代码中的外观示例。

用例:

abstract class UseCase<in P, R>(private val coroutineDispatcher: CoroutineDispatcher) {

    suspend operator fun invoke(parameters: P): Resource<R> {
        return try {
            withContext(coroutineDispatcher) {
                execute(parameters).let {
                    Resource.Success(it)
                }
            }
        } catch (e: Exception) {
            Timber.d(e)
            Resource.Error(e.toString())
        }
    }

    @Throws(RuntimeException::class)
    protected abstract suspend fun execute(parameters: P): R
}
Run Code Online (Sandbox Code Playgroud)

usecase的具体实现:

class GetListUseCase @Inject constructor(
    private val coroutineDispatcher: CoroutineDispatcher,
    private val remoteRepository: RemoteRepository
): UseCase<ListRequest,ItemsList>(coroutineDispatcher) {

    override suspend …
Run Code Online (Sandbox Code Playgroud)

android kotlin dagger-2 android-jetpack dagger-hilt

3
推荐指数
1
解决办法
3467
查看次数

线圈:加载指示器堆叠在图像顶部而不是替换图像?

我正在使用 Jetpack Compose 和 Coil 将照片加载到图像中。我想在加载图像时显示加载指示器,该指示器在加载时替换图片。但是我无法弄清楚并使其正常工作。我的代码的问题是加载指示器正在图像顶部加载(向左,因为我没有设置中心对齐,但它与中心对齐具有相同的行为,只是它位于图像顶部的中心) 。由于框中有额外的项目,它会强制文本视图下降。

有想法该怎么解决这个吗?我想在盒子中央显示加载指示器。

如果有帮助的话,这是带有外观布局的照片。

加载时: 在此输入图像描述

加载时: 在此输入图像描述

这是我的代码:

Column {
            val painter = rememberAsyncImagePainter(
                ImageRequest.Builder(LocalContext.current).data(data = entry.imageUrl).apply(block = fun ImageRequest.Builder.() {
                    crossfade(true)
                        .transformations(
                        )
                        .build()
                }).build()
            )

            val state = painter.state
            if (state is AsyncImagePainter.State.Loading || state is AsyncImagePainter.State.Error) {
                CircularProgressIndicator(
                    color = MaterialTheme.colors.primary,
                    modifier = Modifier.scale(2f)
                )
            }

            viewModel.getImageBackgroundColor(entry.imageUrl, LocalContext.current) { color ->
                dominantColor = color
            }

            Image(
                painter = painter,
                contentDescription = entry.name,
                modifier = Modifier
                    .size(120.dp)
                    .align(CenterHorizontally)
            )

            Text(
                text = entry.name,
                fontFamily …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-compose coil

2
推荐指数
2
解决办法
2861
查看次数

“未解析的类‘PlaceHolderFragment’”

我的布局文件中出现错误:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.myapp.MainActivity$PlaceholderFragment">

    <!-- Some stuff here -->

</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

它在这一行给了我一个错误:

tools:context="com.myapp.MainActivity$PlaceholderFragment"
Run Code Online (Sandbox Code Playgroud)

错误如下:

未解析的类“PlaceHolderFragment”
Android XML 文件内的有效资源引用。

我可以构建我的应用程序并运行它,但我在 Stackoverflow 和其他地方没有找到任何有助于解决我的错误的内容。有人知道我为什么会收到此错误吗?

android android-layout android-fragments

1
推荐指数
1
解决办法
3476
查看次数

获取列中行子集的最大值

我有每个患者在不同时间具有不同值的ID长格式数据,使用tidyr::gather()看起来像这样:

ID    TIME    VALUE
1     10      14
1     20      34
1     30      35
2     10      15
2     20      14
2     30      11
3     10      16
3     20      64
3     30      55
Run Code Online (Sandbox Code Playgroud)

我想添加一个名为包含MAX每个患者达到 max 的时间的新列VALUE,如下所示:

ID    TIME    VALUE    MAX
1     10      14       30
1     20      34       30
1     30      35       30
2     10      15       10
2     20      14       10
2     30      11       10
3     10      16       20
3     20      64       20
3     30 …
Run Code Online (Sandbox Code Playgroud)

r dplyr tidyr

1
推荐指数
1
解决办法
319
查看次数