小编Fra*_*esc的帖子

Kotlin:可空的属性委托可观察

在Kotlin中,我们可以为非null属性定义一个observable,

var name: String by Delegates.observable("<no name>") {
    prop, old, new ->
    println("$old -> $new")
}
Run Code Online (Sandbox Code Playgroud)

但这是不可能的

var name: String? by Delegates.observable("<no name>") {
    prop, old, new ->
    println("$old -> $new")
}
Run Code Online (Sandbox Code Playgroud)

为可空属性定义observable的方法是什么?

编辑:这是编译错误

Property delegate must have a 'setValue(DataEntryRepositoryImpl, KProperty<*>, String?)' method. None of the following functions is suitable: 
public abstract operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String): Unit defined in kotlin.properties.ReadWriteProperty
Run Code Online (Sandbox Code Playgroud)

android kotlin

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

无法在Kotlin中构建发布版本

将我的Android项目转换为Kotlin后,我无法构建发布版本,错误似乎与Proguard有关.

我看到155个警告

Warning:com.example.app.activity.MainActivity$1: can't find referenced field 'android.view.View decorView' in program class com.example.app.activity.MainActivity
Warning:com.example.app.activity.MainActivity$2: can't find referenced field 'android.os.Handler handler' in program class com.example.app.activity.MainActivity
Run Code Online (Sandbox Code Playgroud)

并且构建失败了

Error:Execution failed for task ':MyApp:transformClassesAndResourcesWithProguardForFreeRelease'.
> Job failed, see logs for details
Run Code Online (Sandbox Code Playgroud)

如果我将build.grade中的这些指令从true更改为false,则构建成功.

minifyEnabled true
shrinkResources true
Run Code Online (Sandbox Code Playgroud)

关于问题可能是什么的任何建议?

编辑:

proguard文件如下:

ProGuard的-android.txt

# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps …
Run Code Online (Sandbox Code Playgroud)

android proguard kotlin android-proguard

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

刷新项目列表的MutableLiveData

我正在使用我的应用程序中的体系结构组件中的LiveData和ViewModel.

我有一个分页的项目列表,我在用户向下滚动时加载更多.查询结果存储在

MutableLiveData<List<SearchResult>>
Run Code Online (Sandbox Code Playgroud)

当我执行初始加载并将变量设置为新列表时,它会在绑定适配器上触发回调,将数据加载到recyclerview中.

但是,当我加载第二页并将其他项添加到列表中时,不会触发回调.但是,如果我用包含旧项和新项的新列表替换列表,则回调会触发.

是否可以让LiveData在更新支持列表时通知其观察者,而不仅仅是在LiveData对象更新时?

这不起作用(忽略空检查):

val results = MutableLiveData<MutableList<SearchResult>>()

/* later */

results.value.addAll(newResults)
Run Code Online (Sandbox Code Playgroud)

这有效:

val results = MutableLiveData<MutableList<SearchResult>>()

/* later */

val list = mutableListOf<SearchResult>()
list.addAll(results.value)
list.addAll(newResults)
results.value = list
Run Code Online (Sandbox Code Playgroud)

android android-livedata android-architecture-components

12
推荐指数
2
解决办法
1万
查看次数

在Kotlin中绑定具有多个参数的适配器

要为数据绑定适配器使用多个参数,请使用Java语法

@BindingAdapter(value={"arg1", "arg2"}, requireAll = false)
Run Code Online (Sandbox Code Playgroud)

但是这不能在Kotlin中编译:

Error:(13, 37) Unexpected tokens (use ';' to separate expressions on the same line)
Run Code Online (Sandbox Code Playgroud)

什么是Kotlin中多个参数的正确语法?

android kotlin android-databinding

9
推荐指数
3
解决办法
4270
查看次数

ExoPlayer 上的快速搜索

我想为 ExoPlayer 实现一个scrubber,以显示用户正在寻找的位置的缩略图预览。当我当前的实现工作时,缩略图只会在用户停止拖动搜索栏视图或暂停片刻后刷新。似乎 ExoPlayer 上的搜索命令正在实现类似去抖功能的功能,以防止连续搜索过多。

虽然我可以通过对搜索栏回调进行自己的限制并每 x 毫秒发送一个搜索请求来解决这个问题,但我想知道是否有办法告诉 ExoPlayer 不删除搜索请求,以便缩略图可以实时更新.

作为参考,这是我目前的实现:

节流对象:

private final Subject<Long> subject = PublishSubject.create();
Run Code Online (Sandbox Code Playgroud)

带有限制的搜索请求的观察者:

subject
        .throttleLast(400L, TimeUnit.MILLISECONDS)
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(position -> exoPlayer.seekTo(position));
Run Code Online (Sandbox Code Playgroud)

搜索栏回调:

@Override
public void onProgressChanged(@NonNull final SeekBar seekBar,
                              final int progress,
                              final boolean fromUser) {
    if (fromUser) {
        final long position = computePosition(progress);
        subject.onNext(position);
    }
}
Run Code Online (Sandbox Code Playgroud)

android exoplayer

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

在撰写中自动完成文本视图

我想在撰写中创建一个自动完成文本视图,并且我创建了一个包含TextFieldDropDown菜单的可组合项。我在此解决方案中看到的问题是,当展开下拉菜单时,文本字段不再可操作,我无法在其中输入任何文本。关于如何解决这个问题有什么建议吗?代码如下

@Composable
fun AutoCompleteText(
    value: String,
    onValueChange: (String) -> Unit,
    onOptionSelected: (String) -> Unit,
    modifier: Modifier = Modifier,
    label: @Composable (() -> Unit)? = null,
    suggestions: List<String> = emptyList()
) {
    Column(modifier = modifier) {
        OutlinedTextField(
            value = value,
            onValueChange = { text -> if (text !== value) onValueChange(text) },
            modifier = Modifier.fillMaxWidth(),
            label = label,
        )
        DropdownMenu(
            expanded = suggestions.isNotEmpty(),
            onDismissRequest = {  },
            modifier = Modifier.fillMaxWidth()
        ) {
            suggestions.forEach { label ->
                DropdownMenuItem(onClick = …
Run Code Online (Sandbox Code Playgroud)

android android-jetpack-compose

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

Kotlin和Dagger2

我正在尝试将Kotlin添加到我的项目中,但在启用Kotlin之后,我无法构建,因为Dagger2类不再生成.我尝试了第二个项目,我有同样的问题(实际上更糟糕的是,它抱怨Dagger2和DataBinding).

这些是我为Kotlin所做的改变:

项目build.gradle:

diff --git a/build.gradle b/build.gradle
index 486700c..91e4cda 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,13 +1,15 @@
 // Top-level build file where you can add configuration options common to all sub-projects/modules.

 buildscript {
+    ext.kotlin_version = '1.0.5-3'
     repositories {
         jcenter()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:2.3.0-alpha2'
+        classpath 'com.android.tools.build:gradle:2.3.0-beta1'
         classpath 'com.google.gms:google-services:3.0.0'
         classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files
Run Code Online (Sandbox Code Playgroud)

App build.gradle:

diff --git a/app/build.gradle …
Run Code Online (Sandbox Code Playgroud)

android kotlin dagger-2

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

Kotlin + Dagger - 为ViewModel工厂注入地图

我正在使用带有Dagger2的新架构组件,我想使用Factory类注入我的ViewModels.Factory类本身是可注射的.当在Java中定义Factory类时,这一切都很有效,但是当我将它转换为Kotlin时,Dagger2不知道如何为构造函数生成Map,而在Java中它知道如何这样做.我认为不同之处在于,转换后,Factory类使用kotlin包中的Map,而不是java.util.Map包.如何让Dagger2为Factory构造函数生成地图?

这是Factory类

@ActivityScope
class MainActivityViewModelFactory @Inject
constructor(private val creators: Map<Class<out ViewModel>, Provider<ViewModel>>) : ViewModelProvider.Factory {

    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        var creator: Provider<out ViewModel>? = creators[modelClass]
        if (creator == null) {
            for ((key, value) in creators) {
                if (modelClass.isAssignableFrom(key)) {
                    creator = value
                    break
                }
            }
        }
        if (creator == null) {
            throw IllegalArgumentException("unknown model class " + modelClass)
        }
        try {
            return creator.get() as T
        } catch (e: Exception) {
            throw RuntimeException(e)
        }

    }
} …
Run Code Online (Sandbox Code Playgroud)

android kotlin dagger-2

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

切换日/夜模式时按钮主题错误

我有一个应用程序,我让用户在白天和黑夜模式之间切换,使用主题Theme.AppCompat.DayNight.然而,在切换主题时随机地,按钮具有错误的背景颜色,并且溢出按钮也会发生相同的情况(它将在浅色主题上亮起,或在暗主题上暗淡).我已经编写了一个最小的测试应用程序,这个问题也可以重现.

这是示例应用程序:

styles.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="AppTheme.Yellow">
        <item name="colorAccent">@color/accent_yellow</item>
    </style>

    <style name="AppTheme.LightBlue">
        <item name="colorAccent">@color/accent_light_blue</item>
    </style>

    <style name="AppTheme.Steel">
        <item name="colorAccent">@color/accent_steel</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>

    <color name="accent_light_blue">#ff5677fc</color>
    <color name="accent_yellow">#ffffc107</color>
    <color name="accent_steel">#ff607d8b</color>
</resources>
Run Code Online (Sandbox Code Playgroud)

arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <array name="accent_colors">
        <item>@color/accent_light_blue</item>
        <item>@color/accent_yellow</item>
        <item>@color/accent_steel</item>
    </array>

    <array name="accent_themes">
        <item>@style/AppTheme.LightBlue</item>
        <item>@style/AppTheme.Yellow</item>
        <item>@style/AppTheme.Steel</item>
    </array>

</resources>
Run Code Online (Sandbox Code Playgroud)

activity_main.xml中

<?xml version="1.0" …
Run Code Online (Sandbox Code Playgroud)

android android-theme

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

Flutter moor:缺少 libsqlite3.so

我正在用 Moor 编写一个简单的 Flutter 应用程序;我已经创建了表、数据库和 dao,但是当我启动应用程序时,它崩溃了,错误libsqlite3.so是找不到库。

这是我的数据库

import 'dart:async';
import 'package:moor_ffi/moor_ffi.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
import 'package:moor/moor.dart';
import 'dart:io';

part 'word_database.g.dart';

class Words extends Table {
  IntColumn get id => integer().autoIncrement()();

  TextColumn get english => text()();

  TextColumn get korean => text()();
}

LazyDatabase _openConnection() {
  return LazyDatabase(() async {
    final dbFolder = await getApplicationDocumentsDirectory();
    final file = File(p.join(dbFolder.path, 'db.sqlite'));
    return VmDatabase(file);
  });
}

@UseMoor(tables: [Words], daos: [WordDao])
class WordDatabase extends _$WordDatabase {
  WordDatabase() : super(_openConnection());

  @override …
Run Code Online (Sandbox Code Playgroud)

flutter flutter-moor

6
推荐指数
3
解决办法
1222
查看次数