我正在使用 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
我正在使用 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) 我正在尝试开发一个联合插件,它将包装一个本机 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)
但我找不到任何关于此的示例,以及它如何实现的帮助以及平台插件如何使用平台接口包,如文档中所述
关于这个主题有什么好的和更新的示例或教程吗?
在我的应用程序中,我开始使用工具栏设置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)
我正在使用 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)
它工作得很好,但问题在于缓存如果我发送相同的突变两次,它会返回缓存的结果而不是再次发送!
感谢任何帮助。
我正在开发 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 运行应用程序,它会保留,但从命令行它只会返回默认值并且构建失败!
我创建了一个用于时间选择的自定义小部件。
该小部件包含一个可打开 TimePicker 的图标和一个 TextFormField,以便用户可以手动键入时间值。
当用户键入一个值时,它会立即验证,并且当焦点关闭时,它会验证该值并使用正确的时间格式更新字段。
例如,如果用户键入 8,然后单击下一个小部件,它将更新为 8:00
我想要的是,当用户输入 StartTime,然后单击键盘的 Next 按钮时,焦点将移动到 EndTime 选择器。然后,当用户单击 EndTime Picker 上的“Next”按钮时,焦点将移动到表单中的下一个小部件
问题是 FocusNode 位于 TimePicker 自定义小部件(即 StateFull)内部,我无法弄清楚如何将其暴露在外部。
您可以在这里查看它的代码: https: //github.com/moti0375/tikal_time_tracker/blob/develop/lib/ui/time_picker.dart
任何想法将不胜感激。
我正在使用 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 个项目,如何测试呢?
有没有办法只验证实例类型而不验证内容?