我想实现一些 UI 测试,以确保今天实现的代码明天也能正常工作,但是当尝试查看过去实现的 UI 测试是否有效时,它会抛出此错误:
Caused by: io.mockk.MockKException: Failed matching mocking signature for left matchers: [any(), any()]
这种情况发生在every {} return Unit有一个名为 WakeUpTimeManager 的对象文件的行上,该文件调用 .set(param1, param2)函数,并且在该函数内部有一些内联函数,我认为这可能会导致问题,但我不知道。我尝试在互联网上搜索但找不到解决方案。
这是引发错误的测试:
@Before
fun setup() {
mockkObject(WakeUpTimerManager)
every { WakeUpTimerManager.set(any(), any()) } returns Unit
}
Run Code Online (Sandbox Code Playgroud)
every这是在线调用的函数
fun set(context: Context, timer: Timer) {
if (timer.atMillis < System.currentTimeMillis()) {
return
}
if (Preset.findByID(context, timer.presetID) == null) {
return
}
//This is an inline function
withGson {
PreferenceManager.getDefaultSharedPreferences(context).edit {
putString(PREF_WAKE_UP_TIMER, …Run Code Online (Sandbox Code Playgroud) 所以我知道当我不使用 Modifier.height()时就像设置了“WRAP_CONTENT”,但是如果我想将高度值设置为 WRAP_CONTENT 该怎么办?有没有办法做到这一点?
已经尝试过 InstrinsicSize.Min、InstrinsicSize.Max 和 0.dp。
寻找这样的东西:Modifier.height(WRAP_CONTENT)
这仅适用于特定知识,因为我在文档中找不到任何内容。
我正在注入Dagger-Hilt一个依赖于@ActivityContextViewModel 的类,该模块安装在ActivityComponent活动中并限定范围,每当我尝试编译时,它都会抛出错误。供您参考,我还有其他带有 ActivityRetainedComponent 和 SingletonComponent 注入 @ApplicationContext 的模块。
现在我试图弄清楚这个错误是什么意思。
\nerror: [Dagger/MissingBinding] com.rober.fileshortcut_whereismyfile.utils.PermissionsUtils cannot be provided without an @Inject constructor or an @Provides-annotated method.\n public abstract static class SingletonC implements App_GeneratedInjector,\n ^\n com.rober.fileshortcut_whereismyfile.utils.PermissionsUtils is injected at\n com.rober.fileshortcut_whereismyfile.ui.fragments.filefragment.FileViewModel(\xef\xbf\xbd, permissionsUtils, \xef\xbf\xbd)\n com.rober.fileshortcut_whereismyfile.ui.fragments.filefragment.FileViewModel is injected at\n com.rober.fileshortcut_whereismyfile.ui.fragments.filefragment.FileViewModel_HiltModules.BindsModule.binds(vm)\n @dagger.hilt.android.internal.lifecycle.HiltViewModelMap java.util.Map<java.lang.String,javax.inject.Provider<androidx.lifecycle.ViewModel>> is requested at\n dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.ViewModelFactoriesEntryPoint.getHiltViewModelMap() [com.rober.fileshortcut_whereismyfile.App_HiltComponents.SingletonC ? com.rober.fileshortcut_whereismyfile.App_HiltComponents.ActivityRetainedC ? com.rober.fileshortcut_whereismyfile.App_HiltComponents.ViewModelC]\nRun Code Online (Sandbox Code Playgroud)\n这是代码(我不认为这里有什么问题)
\n@Module\n@InstallIn(ActivityComponent::class)\nobject PermissionModule {\n\n @ExperimentalCoroutinesApi\n @Provides\n @ActivityScoped\n fun providePermissionsHelper(\n @ActivityContext context: Context,\n ) = PermissionsUtils(context)\n}\nRun Code Online (Sandbox Code Playgroud)\n … 嗨,我是新作曲家,我正在尝试调试这个奇怪的文本颜色错误
颜色应该是白色,它就像一种灰色的深色,一旦我将它们滚动到视线之外并滚动回到之前的位置,它似乎就会消失并设置白色。
很确定以前有人犯过这个错误,我错过了什么吗?为什么会出现这个错误?
编辑:只有当我的手机激活了黑暗模式时才会发生这种情况。如果我停用它并在 TodoTheme(...) 中设置 false/true ,一切都会按预期工作。
最简单的重现代码:
setContent {
TodoTheme {
TodoScreen()
}
}
@Composable
fun TodoScreen(
) {
val text = "This is a big text that will make color change and won't be very much visible for the user, why does this happen?"
LazyColumn(){
items(listOf(text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text,text)) { string ->
Text(text = string, color = MaterialTheme.colors.onSurface)
}
}
}
Run Code Online (Sandbox Code Playgroud)
颜色是默认的颜色(我不认为这是颜色问题):
val LightThemeColors = lightColors(
primary = Purple700,
primaryVariant = Purple800,
onPrimary = Color.White,
secondary = Color.White,
onSecondary = …Run Code Online (Sandbox Code Playgroud) 我知道如何获取按钮/或组件的 X,Y 坐标,但我想知道每个角的偏移量或至少是右下角的偏移量。例如,我从以下位置获取左上角坐标:
Modifier.onGloballyPositioned{
it.positionInRoot().x
it.positionInRoot().y
}
Run Code Online (Sandbox Code Playgroud)
有没有办法知道右下角坐标,以便我可以计算组件内部的差异偏移?
编辑:可能的解决方案 - >在组件旁边使用间隔符:让我们想象一下我们想要获得按钮的右下角。
Row(
horizontalArrangement = Arrangement.Center,
modifier = Modifier
.fillMaxWidth()
) {
Button(
modifier = Modifier
.onGloballyPositioned {
it.positionInRoot().x
it.positionInRoot().y
}
) {...}
Row(modifier =Modifier.fillMaxHeight(),verticalAlignment = Alignment.Bottom) {
Spacer(
Modifier
.height(0.dp)
.width(0.dp)
.onGloballyPositioned {
it.positionInRoot().x
it.positionInRoot().y
}
)
}
}
Run Code Online (Sandbox Code Playgroud) 所以当我使用新的 API 时,我通常会收到这种典型的错误消息
com.squareup.moshi.JsonDataException: Required value 'X' (JSON name 'x') missing at $
at com.squareup.moshi.internal.Util.missingProperty(Util.java:649)
at com.squareup.moshi.kotlin.reflect.KotlinJsonAdapter.fromJson(KotlinJsonAdapter.kt:103)
at com.squareup.moshi.internal.NullSafeJsonAdapter.fromJson(NullSafeJsonAdapter.java:41)
at retrofit2.converter.moshi.MoshiResponseBodyConverter.convert(MoshiResponseBodyConverter.java:46)
at retrofit2.converter.moshi.MoshiResponseBodyConverter.convert(MoshiResponseBodyConverter.java:27)
at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:243)
at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:153)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
Run Code Online (Sandbox Code Playgroud)
我想知道一种方法来准确调试此调用返回的内容。例如,如果它缺少参数“X”,那么我想知道它是否为空或者是否返回一些数据。
已经尝试过日志拦截器,但我认为我没有正确设置它。有什么确切的方法来调试此调用返回的确切数据是什么?
解决方案:我认为使用Web调试器是唯一的方法(例如Charles Proxy)
所以我使用 gps 类来打开 gps,这是一种允许我们发送到的方法onActivityResult,但由于在 AndroidX 上已弃用并且仍然可用,android 团队向我们推荐下一个:
强烈推荐使用AndroidX中引入的Activity Result APIs
我有以下代码,我尝试发送到 onActivityResult
val rae = e as ResolvableApiException
rae.startResolutionForResult(context,Constants.GPS_REQUEST)
Run Code Online (Sandbox Code Playgroud)
如何使用新 API 处理相同的事情?
我对这个话题有一些疑问。
我只使用 android 为我们提供的 API 的夜间/白天主题,您可以为两者设置主题。然后它适用于 setNightMode() 和类似的东西。然后我所做的是在视图背景中设置一种颜色,当设置为夜间主题时它会发生变化
所以我想知道我是否像这样创建 3 个主题(浅色/深色/蓝色)(我不想重复代码,所以我将显示 1 个主题):
<style name="Theme.Blue" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/green</item>
<item name="colorPrimaryVariant">@color/greentwo</item>
<item name="colorOnPrimary">@color/reed</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
Run Code Online (Sandbox Code Playgroud)
然后当我进入活动/片段时:
我检查用户设置的首选主题是什么,例如看到的主题是Theme.Blue
因此,对于这个主题,我想加载一些绿色文本和其他红色文本,所以我的想法是以编程方式设置主题。TextView.setAppareance(Theme style)这似乎是一项非常艰苦的工作。
同样的情况也适用于背景,其中存在相同颜色的较高和较低色调的对比等等。
我是否必须继承任何主题,将其设置在 xml 的顶部或将其 1 by 1 设置到每个视图或我不知道的任何内容?
那么我该怎么做呢,推荐的方法是什么?
我不太明白 colorPrimary、colorPrimaryVariant 之类的东西去哪里了。例如,当创建警报对话框时,按钮设置为绿色!
关于管理当前用户首选项主题不是问题,问题在于将其应用到所有视图的样式。
我有一个rememberSaveable进行derivedStateOf一些计算以返回一个类作为输出。
我已经将 Parceable/Parcelize 添加到类中,但它仍然崩溃并告诉我实现自定义保护程序。我相信这是因为我正在使用derivedStateOf. 我是否可以保存衍生状态的计算输出的状态?
java.lang.IllegalArgumentException:无法使用当前的 SaveableStateRegistry 保存 DerivedState(value=MyClass(MyClass2()))。默认实现仅支持可以存储在 Bundle 内的类型。请考虑为此类实现自定义 Saver 并将其传递给 RememberSaveable()。
代码看起来像这样
val someCalculation by rememberSaveable(someTriggering) {
derivedStateOf {
someCalculationThatReturnsAClass()
}
}
Run Code Online (Sandbox Code Playgroud) 假设我们有接下来的 5 行代码:
@Composable
fun MyParentComposable() {
var myVariable by remember { mutableStateOf(0) }
MyChildComposable(myVariable)
}
Run Code Online (Sandbox Code Playgroud)
我知道每当我们改变时,myVariable我们都会重新组合MyParentComposable,并且MyChildComposable任何其他孩子都会MyChildComposable()阅读该值。
我知道,如果我不在myVariable任何可组合项中使用它MyChildComposable,那么在更改它时它仍然会被重新组合,因为我们正在某处读取它(我猜想在参数中,即使它没有被使用)
我知道,如果我们传递 lambda 并推迟读取,那么只有调用该值的组件和父作用域才会被重构MyChildComposable。
问题是,当传递myVariable到时MyChildComposable,我是在读它还是还有别的东西?
我想查看一些反编译的代码或类似的东西来更深入地理解它,但我不知道应该去哪里。希望有人能在这里提供一些线索,让我可以说“是的,就是因为这个”
这个例子也是如此
@Composable
fun MyParentComposable() {
val myVariable = remember { mutableStateOf(0) }
MyChildComposable(myVariable.value)
}
Run Code Online (Sandbox Code Playgroud)
我正在读取范围中的值MyParentComposable()并将其传递下来MyChildComposable()
编辑:
没有 Lambda 的示例:ParentComposable 和 child 被重新组合,内部没有任何可组合项读取它,只有带有参数的可组合项
@Composable
fun MyParentComposable() {
var myVariable by remember { mutableStateOf(0) …Run Code Online (Sandbox Code Playgroud) 我想更改SelectionContainer的颜色,但在参数部分中没有看到任何可以在此处进行更改的选项。我还查看了内部代码,但看不到任何与颜色相关的内容。文档没有提到这一点。
问题:有没有办法改变选择颜色,或者这是不可能的?
android ×11
android-view ×1
androidx ×1
dagger-2 ×1
dagger-hilt ×1
deprecated ×1
gps ×1
kotlin ×1
mockk ×1
moshi ×1
retrofit2 ×1