小编Mot*_*tov的帖子

DiffUtil.Callback 未按预期工作

我正在使用 DiffUtil.ItemCallback 和 ListAdapter 来更新 RecyclerView。

它工作得很好,但它的行为让我感到困扰。

根据文档,areContentsTheSame只有在areItemsTheSame返回时才应调用该方法true

从文档:

仅当 areItemsTheSame(int, int) 为这些项目返回 true 时才调用此方法。

但是,就我而言,在使用新列表更新列表时,如下所示:

adapter.submitList(items.toMutableList())
Run Code Online (Sandbox Code Playgroud)

DiffUtil.ItemCallback 确实被触发,但即使areItemsTheSame返回true它也不会立即调用areContentTheSame(如预期的那样?),而是areItemsTheSame在不同的对象对上一次又一次地调用,(我在那里使用了带有断点的调试器)。经过areItemsTheSame几次调用并返回true,最后它会调用areContentTheSame,有时,我看到传递给的对象areContentTheSame实际上不一样!!并且有不同的id!!这意味着areContentTheSame甚至不应该调用这些对!

这是我的 DiffUtilCallback 的实现方式:

class AppDiffCallback : DiffUtil.ItemCallback<Item?>() {

override fun areItemsTheSame(oldItem: Item, newItem: Item): Boolean {
    Timber.i("areItemsTheSame: called..")
    if (oldItem.getItemType() == newItem.getItemType()) {
        Timber.i("areItemsTheSame: done true..")
        return true
    }
    Timber.w("areItemsTheSame: done false..")
    return false
}

override fun areContentsTheSame(oldItem: Item, …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview android-diffutils android-listadapter

8
推荐指数
0
解决办法
2234
查看次数

Android ActivityRecognition 和 IMMUTABLE PendingIntent

我正在使用 Android ActivityRecognition api。当将 PendingIntent 标志设置为PendingIntent.FLAG_UPDATE_CURRENT 或 PendingIntent.FLAG_IMMUTABLE(按照建议?)时,收到的意图不包含任何额外内容。

我的使用方法如下:

首先,我创建一个待处理的意图,如下所示:

private val intent: Intent = Intent(context, ActivityRecognitionReceiver::class.java) 
private val mActivityTransitionPendingIntent = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) //This gives warning that Mutability flag required
Run Code Online (Sandbox Code Playgroud)

然后,我像这样设置转换列表:

private val INTERESTING_TRANSITION = intArrayOf(
    DetectedActivity.IN_VEHICLE,
    DetectedActivity.STILL,
    DetectedActivity.ON_FOOT,
    DetectedActivity.WALKING,
 )
Run Code Online (Sandbox Code Playgroud)

接下来,创建一个请求:

val transitions = mutableListOf<ActivityTransition>()

   for (activity in INTERESTING_TRANSITION) {
        transitions.add(
            ActivityTransition.Builder()
                .setActivityType(activity)
                .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
                .build()
        )
        transitions.add(
            ActivityTransition.Builder()
                .setActivityType(activity)
                .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
                .build()
        )
    }

val request = ActivityTransitionRequest(transitions)
Run Code Online (Sandbox Code Playgroud)

最后注册请求:

   val transitionTask: Task<Void> = mActivityRecognitionClient.requestActivityTransitionUpdates(request, …
Run Code Online (Sandbox Code Playgroud)

android activity-recognition

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

Flutter 联合插件

我正在尝试开发一个联合插件,它将包装一个本机 SDK(适用于 android 和 ios),如此处所述,并且还查看了此处显示的示例和url_launcher 插件示例,但尽管如此,我还是无法弄清楚一些事情。 。

文档中没有示例如何创建平台接口包 以及如何在插件的所有平台中使用它(示例文章和 url_launcher 显示了 Web 插件,但示例项目的 ios 和 android 均未使用平台接口包)并且这些示例似乎很旧并且没有更新。

此外,他们还解释说,平台包应该引用pubspec.yaml 中的平台接口包,其实现定义如下:

flutter:
plugin:
  implements: hello //this refers to the platform interface package
platforms:
  windows:
    pluginClass: HelloPlugin
Run Code Online (Sandbox Code Playgroud)

但我找不到任何关于此的示例,以及它如何实现的帮助以及平台插件如何使用平台接口包,如文档中所述

关于这个主题有什么好的和更新的示例或教程吗?

flutter flutter-plugin

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

动作栏后退箭头方向

在我的应用程序中,我开始使用工具栏设置UI以满足Material Design.

我想在操作栏上添加后退箭头.它看起来还不错,但不知何故,当我将我的手机位置改为希伯来语时,这是一种rtl语言,箭头改变它的方向,而不是指向"out",它现在指向"in".请参考图片,了解箭头的希伯来语和英语.有没有办法控制箭头方向(我希望它总是指出"当然")?

我试图添加android:layoutDirection ="ltr"和android:textDirection ="ltr",但它没有帮助.

谢谢谁能回答这个问题.

在此输入图像描述

以下是工具栏布局的代码:

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="@color/primaryColor"
app:theme="@style/MyCustomToolBarTheme"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
android:textDirection="ltr"
android:layoutDirection="ltr">
Run Code Online (Sandbox Code Playgroud)

android android-actionbar material-design

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

Flutter GraphQl 客户端缓存

我正在使用 Flutter graphql_client ,它的实现与本示例中的差不多

我的客户端创建如下所示:

abstract class AbstractAdapter {
  Link get httpLink;

 GraphQLClient client;

 AbstractAdapter() {
   client = GraphQLClient(cache: InMemoryCache(), link: httpLink);
 }

 Future<QueryResult> query(QueryOptions options) {
   return client.query(options);
 }
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但问题在于缓存如果我发送相同的突变两次,它会返回缓存的结果而不是再次发送!

感谢任何帮助。

graphql flutter flutter-graphql

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

科尔多瓦安卓配置

我正在开发 Cordova 应用程序,并尝试更改 cdv-gradle-condig.json 中的值,但每当我从命令行运行应用程序时,它都会返回默认值:

cordova run android
Run Code Online (Sandbox Code Playgroud)

特别是我正在尝试更新 AGP_VERSION,因为它似乎是应用程序 gradle 的插件版本

{
 "MIN_SDK_VERSION": 22,
 "SDK_VERSION": 30,
 "GRADLE_VERSION": "7.1.1",
 "MIN_BUILD_TOOLS_VERSION": "30.0.3",
 "AGP_VERSION": "4.2.2", <--//How can I change this??
 "KOTLIN_VERSION": "1.6.10",
 "ANDROIDX_APP_COMPAT_VERSION": "1.3.1",
 "ANDROIDX_WEBKIT_VERSION": "1.4.0",
 "GRADLE_PLUGIN_GOOGLE_SERVICES_VERSION": "4.3.8",
 "IS_GRADLE_PLUGIN_GOOGLE_SERVICES_ENABLED": false,
 "IS_GRADLE_PLUGIN_KOTLIN_ENABLED": true
}

dependencies {
   // Android Gradle Plugin (AGP) Build Tools
   classpath "com.android.tools.build:gradle:${cordovaConfig.AGP_VERSION}"
}
Run Code Online (Sandbox Code Playgroud)

另外,我还尝试从 gradle-wrapper.properties 更新 gradle 分发 url:

distributionUrl=https://services.gradle.org/distributions/gradle-7.4-bin.zip
Run Code Online (Sandbox Code Playgroud)

如果我手动更改值并从 AndroidStudio 运行应用程序,它会保留,但从命令行它只会返回默认值并且构建失败!

android cordova cordova-android

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

Flutter Widget 焦点问题

我创建了一个用于时间选择的自定义小部件。

该小部件包含一个可打开 TimePicker 的图标和一个 TextFormField,以便用户可以手动键入时间值。

它是这样的: 在此输入图像描述

当用户键入一个值时,它会立即验证,并且当焦点关闭时,它会验证该值并使用正确的时间格式更新字段。

例如,如果用户键入 8,然后单击下一个小部件,它将更新为 8:00

使用 2 个 TimePickers 检查表单图像: 在此输入图像描述

我想要的是,当用户输入 StartTime,然后单击键盘的 Next 按钮时,焦点将移动到 EndTime 选择器。然后,当用户单击 EndTime Picker 上的“Next”按钮时,焦点将移动到表单中的下一个小部件

问题是 FocusNode 位于 TimePicker 自定义小部件(即 StateFull)内部,我无法弄清楚如何将其暴露在外部。

您可以在这里查看它的代码: https: //github.com/moti0375/tikal_time_tracker/blob/develop/lib/ui/time_picker.dart

任何想法将不胜感激。

focus flutter flutter-layout

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

Flutter BLoC 测试

我正在使用 flutter_bloc 库并尝试进行单元测试。我正在按照本教程中的说明进行操作,并且效果很好。

但是,如果扩展 Equatable(必需)的 BlocState 具有扩展 Equatable 的许多属性或大型项目列表,以及根据需要定义的 props[] 。

这使得expectLater()匹配正确的发出状态变得困难,因为它试图将确切的实例与其内容匹配,而不仅仅是状态类型或实例。

例如:

考虑以下 State 类:

class BlocState extends Equatable{
     final List<String> data;
     BlocState({this.data});

     @override
     List<Object> get props => [data];
}
Run Code Online (Sandbox Code Playgroud)

然后对于这样的发射状态:

List<String> data = ['Mark', 'Mike', 'John']
BlocState({data: data}); 
Run Code Online (Sandbox Code Playgroud)

这个expectLater会失败

 expectLater(
    bloc,
    emitsInOrder([BlocState(),]), //This will fail as the state does't equals exactly to the real state
  )
Run Code Online (Sandbox Code Playgroud)

这一个将会通过:

expectLater(
    bloc,
    emitsInOrder([BlocState(data: ['Mark', 'Mike', 'John']),]), //This will pass 
  )
Run Code Online (Sandbox Code Playgroud)

在如此简单的状态下,验证确切的内容是可以的,但如果列表有 100 个项目,如何测试呢?

有没有办法只验证实例类型而不验证内容?

flutter flutter-test flutter-bloc

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