小编Car*_*son的帖子

Dagger 2麻烦@Injecting-FirebaseMessagingService

我最近尝试将我正在处理的应用程序迁移GCMFCM.在这样做的时候,我发现我以前一直Dagger 2 (2.0.2)用来在服务中提供我的RetrofitAPI和其他用户数据管理器的实例(没有问题),我再也不能这样做了FirebaseMessagingService.

每当我尝试使用FirebaseMessagingService我的Dagger 2 Component界面中列出的子类进行编译时,我都会得到一个IllegalArgumentException.在深入研究一些代码之后,似乎在Dagger 2尝试验证类名并发现第一个字母不是大写时抛出异常.FirebaseMessagingService至少在我的最后,继承自uglified/minified代码库,它的直接超类是zzb(public class FirebaseMessagingService extends com.google.firebase.iid.zzb).

我最好的猜测是,这是罪魁祸首.如果这确实是问题,我不知道该怎么做才能坚持到GCM现在.任何人对此有任何想法或类似的经验吗?

编辑:我有机会向其中一位Firebase开发人员询问此问题:https://www.reddit.com/r/androiddev/comments/4upj1o/beware_of_the_new_firebase/d5tdbk3 - 无解决方案.我可能只是避免直接注入并合并到静态API提供程序.

java android firebase google-cloud-messaging dagger-2

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

如何使用 PathClassLoader 替换已弃用的 DexFile API?

我有一个类,我在其中进行了一些运行时注释扫描,但它使用了已弃用的 DexFile API,这会导致 LogCat 中出现警告:

  • W/zygote64: Opening an oat file without a class loader. Are you using the deprecated DexFile APIs?.

我想摆脱此消息并使用适当的 API。文档建议PathClassLoader,但我不明白它DexFile在功能上的等效性。我可以将 aPathClassLoaderDexFile实例结合使用,虽然它确实有效,但它会给我更多警告并且需要更长的时间来扫描。为了清楚起见,我已经包含了我在下面写的注释扫描器。如果有人可以建议如何摆脱这些警告消息和 的替代方案DexFile,因此在删除后我不会受到损坏的功能的影响,我会非常感激。

class AnnotationScanner {
    companion object {
        fun classesWithAnnotation(
            context: Context,
            annotationClass: Class<out Annotation>,
            packageName: String? = null
        ): Set<Class<*>> {

            return Pair(context.packageCodePath, context.classLoader)
                .letAllNotNull { packageCodePath, classLoader ->
                    Pair(DexFile(packageCodePath), classLoader)
                }
                ?.letAllNotNull { dexFile, classLoader ->
                    dexFile
                        .entries()
                        ?.toList()
                        ?.filter { entry …
Run Code Online (Sandbox Code Playgroud)

android jvm classloader dalvik dex

6
推荐指数
0
解决办法
2171
查看次数

dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper 不能转换为 android.app.Activity

我正在使用具有一些自定义视图实现的第三方库。在实现中,他们调用Utils.showSoftKeyboard(context as Activity). 这与使用片段作为 @AndroidEntryPoint 一起会导致以下异常:

java.lang.ClassCastException: dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper cannot be cast to android.app.Activity.

有没有办法在不改变第三方库的情况下解决这个问题?

android kotlin dagger-hilt

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

AnimatedVisibility 打破了 Jetpack Compose 中 ConstraintLayout 中的约束

编辑:当我交换使用对齐时也会ConstraintLayout发生Box......

目前似乎在 JP Compose 中AnimatedVisibility表现不佳。ConstraintLayout

        AnimatedVisibility(
          visible = entryListState.firstVisibleItemIndex > 3,
          enter = fadeIn() + expandIn(expandFrom = Alignment.Center),
          exit = fadeOut() + shrinkOut(shrinkTowards = Alignment.Center)
        ) {
          ExtendedFloatingActionButton(
            modifier = Modifier.constrainAs(scrollToTop) {
              start.linkTo(parent.start)
              bottom.linkTo(parent.bottom)
            },
            text = { Text(text = "TOP") },
            onClick = { scope.launch { entryListState.animateScrollToItem(0) } }
          )
        }
Run Code Online (Sandbox Code Playgroud)

( TOP ) fab 应该出现在左下角,但我却得到了不正确的放置

当我取下AnimatedVisibility包装纸时,一切正常。:( 我知道我可以解决这个问题,但我很好奇我在可组合项的配置方面是否做错了什么AnimatedVisibility

android-jetpack-compose

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

Jetpack Compose - 阻止焦点元素窃取后压力?

我有一些元素集中在底部工作表中。我想在按下系统后退按钮时折叠底部工作表,这很简单:

  BackHandler(enabled = bottomSheetState.isExpanded) {
    scope.launch {
      bottomSheetState.collapse()
    }
  }
Run Code Online (Sandbox Code Playgroud)

问题是,如果一个元素聚焦在底部工作表中,则只有在按两次后退按钮后才会触发后退处理程序的逻辑:一次从元素(轮廓文本字段)中删除焦点,再一次触发折叠。

我尝试使用 来LocalFocusManager.current组合按下后退时清除焦点,但直到元素已经失去焦点后才触发后退逻辑。

我可以清楚地关注折叠,所以我猜真正的问题是当工作表 1) 可见并且 2) 有一个子元素聚焦时,必须按回两次。

有没有办法阻止焦点元素取代我的后台逻辑?

android-jetpack-compose android-jetpack-compose-scaffold

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

通过滥用if语句中的三元条件调用条件方法?

最近,我正在进行代码审查,并遇到了这个人:

if(!sharePermission.isExpired() ? activePermissions.add(sharePermission) : expiredPermissions.add(sharePermission));
Run Code Online (Sandbox Code Playgroud)

基本上,使用三元表达式来调用返回布尔值并将其包装在if(...)语句中的方法,以满足成为独立语句的要求。这是否比

if(!sharePermission.isExpired())
   activePermissions.add(sharePermission); 
else 
   expiredPermissions.add(sharePermission); 
Run Code Online (Sandbox Code Playgroud)

如果您真的需要将代码压缩为一行?当包裹在if(...)?中时,是否为从三元表达式返回的值分配了额外的空间?

我不喜欢他们两个,只是好奇。

java ternary-operator

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