在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后,我无法构建发布版本,错误似乎与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) 我正在使用我的应用程序中的体系结构组件中的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) 要为数据绑定适配器使用多个参数,请使用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中多个参数的正确语法?
我想为 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) 我想在撰写中创建一个自动完成文本视图,并且我创建了一个包含TextField和DropDown菜单的可组合项。我在此解决方案中看到的问题是,当展开下拉菜单时,文本字段不再可操作,我无法在其中输入任何文本。关于如何解决这个问题有什么建议吗?代码如下
@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) 我正在尝试将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) 我正在使用带有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) 我有一个应用程序,我让用户在白天和黑夜模式之间切换,使用主题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) 我正在用 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) android ×9
kotlin ×5
dagger-2 ×2
android-architecture-components ×1
exoplayer ×1
flutter ×1
flutter-moor ×1
proguard ×1