diff --git a/android/.kotlin/errors/errors-1767774610166.log b/android/.kotlin/errors/errors-1767774610166.log new file mode 100644 index 0000000..2488fb4 --- /dev/null +++ b/android/.kotlin/errors/errors-1767774610166.log @@ -0,0 +1,198 @@ +kotlin version: 2.1.0 +error message: Daemon compilation failed: null +java.lang.Exception + at org.jetbrains.kotlin.daemon.common.CompileService$CallResult$Error.get(CompileService.kt:69) + at org.jetbrains.kotlin.daemon.common.CompileService$CallResult$Error.get(CompileService.kt:65) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemon(GradleKotlinCompilerWork.kt:240) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemonOrFallbackImpl(GradleKotlinCompilerWork.kt:159) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:111) + at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:76) + at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62) + at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) + at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59) + at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:174) + at java.base/java.util.concurrent.FutureTask.run(Unknown Source) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:194) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:127) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:169) + at org.gradle.internal.Factories$1.create(Factories.java:31) + at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:132) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:133) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) + at java.base/java.util.concurrent.FutureTask.run(Unknown Source) + at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) + at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) + at java.base/java.lang.Thread.run(Unknown Source) +Caused by: java.lang.AssertionError: java.lang.Exception: Could not close incremental caches in D:\www\dating_touchme_app\build\emoji_picker_flutter\kotlin\compileDebugKotlin\cacheable\caches-jvm\jvm\kotlin: class-fq-name-to-source.tab, source-to-classes.tab, internal-name-to-source.tab + at org.jetbrains.kotlin.com.google.common.io.Closer.close(Closer.java:236) + at org.jetbrains.kotlin.incremental.IncrementalCachesManager.close(IncrementalCachesManager.kt:55) + at kotlin.io.CloseableKt.closeFinally(Closeable.kt:56) + at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileNonIncrementally(IncrementalCompilerRunner.kt:293) + at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:129) + at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:674) + at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:91) + at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1659) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) + at java.base/java.lang.reflect.Method.invoke(Unknown Source) + at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) + at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source) + at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source) + at java.base/java.security.AccessController.doPrivileged(Unknown Source) + at java.rmi/sun.rmi.transport.Transport.serviceCall(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(Unknown Source) + at java.base/java.security.AccessController.doPrivileged(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) + ... 3 more +Caused by: java.lang.Exception: Could not close incremental caches in D:\www\dating_touchme_app\build\emoji_picker_flutter\kotlin\compileDebugKotlin\cacheable\caches-jvm\jvm\kotlin: class-fq-name-to-source.tab, source-to-classes.tab, internal-name-to-source.tab + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner.forEachMapSafe(BasicMapsOwner.kt:95) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner.close(BasicMapsOwner.kt:53) + at org.jetbrains.kotlin.com.google.common.io.Closer.close(Closer.java:223) + ... 22 more + Suppressed: java.lang.IllegalArgumentException: this and base files have different roots: C:\Users\Administrator\AppData\Local\Pub\Cache\hosted\pub.flutter-io.cn\emoji_picker_flutter-4.4.0\android\src\main\kotlin\com\fintasys\emoji_picker_flutter\EmojiPickerFlutterPlugin.kt and D:\www\dating_touchme_app\android. + at kotlin.io.FilesKt__UtilsKt.toRelativeString(Utils.kt:117) + at kotlin.io.FilesKt__UtilsKt.relativeTo(Utils.kt:128) + at org.jetbrains.kotlin.incremental.storage.RelocatableFileToPathConverter.toPath(RelocatableFileToPathConverter.kt:24) + at org.jetbrains.kotlin.incremental.storage.FileDescriptor.save(FileToPathConverter.kt:33) + at org.jetbrains.kotlin.incremental.storage.FileDescriptor.save(FileToPathConverter.kt:30) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.doPut(PersistentMapImpl.java:443) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.put(PersistentMapImpl.java:422) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentHashMap.put(PersistentHashMap.java:105) + at org.jetbrains.kotlin.incremental.storage.LazyStorage.set(LazyStorage.kt:80) + at org.jetbrains.kotlin.incremental.storage.InMemoryStorage.applyChanges(InMemoryStorage.kt:108) + at org.jetbrains.kotlin.incremental.storage.InMemoryStorage.close(InMemoryStorage.kt:136) + at org.jetbrains.kotlin.incremental.storage.PersistentStorageWrapper.close(PersistentStorage.kt:124) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner$close$1.invoke(BasicMapsOwner.kt:53) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner$close$1.invoke(BasicMapsOwner.kt:53) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner.forEachMapSafe(BasicMapsOwner.kt:87) + ... 24 more + Suppressed: java.lang.IllegalArgumentException: this and base files have different roots: C:\Users\Administrator\AppData\Local\Pub\Cache\hosted\pub.flutter-io.cn\emoji_picker_flutter-4.4.0\android\src\main\kotlin\com\fintasys\emoji_picker_flutter\EmojiPickerFlutterPlugin.kt and D:\www\dating_touchme_app\android. + at kotlin.io.FilesKt__UtilsKt.toRelativeString(Utils.kt:117) + at kotlin.io.FilesKt__UtilsKt.relativeTo(Utils.kt:128) + at org.jetbrains.kotlin.incremental.storage.RelocatableFileToPathConverter.toPath(RelocatableFileToPathConverter.kt:24) + at org.jetbrains.kotlin.incremental.storage.FileDescriptor.getHashCode(FileToPathConverter.kt:50) + at org.jetbrains.kotlin.incremental.storage.FileDescriptor.getHashCode(FileToPathConverter.kt:30) + at org.jetbrains.kotlin.com.intellij.util.containers.LinkedCustomHashMap.hashKey(LinkedCustomHashMap.java:109) + at org.jetbrains.kotlin.com.intellij.util.containers.LinkedCustomHashMap.remove(LinkedCustomHashMap.java:153) + at org.jetbrains.kotlin.com.intellij.util.containers.SLRUMap.remove(SLRUMap.java:89) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.flushAppendCache(PersistentMapImpl.java:999) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.doPut(PersistentMapImpl.java:451) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.put(PersistentMapImpl.java:422) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentHashMap.put(PersistentHashMap.java:105) + at org.jetbrains.kotlin.incremental.storage.LazyStorage.set(LazyStorage.kt:80) + at org.jetbrains.kotlin.incremental.storage.InMemoryStorage.applyChanges(InMemoryStorage.kt:108) + at org.jetbrains.kotlin.incremental.storage.AppendableInMemoryStorage.applyChanges(InMemoryStorage.kt:179) + at org.jetbrains.kotlin.incremental.storage.InMemoryStorage.close(InMemoryStorage.kt:136) + at org.jetbrains.kotlin.incremental.storage.AppendableSetBasicMap.close(BasicMap.kt:157) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner$close$1.invoke(BasicMapsOwner.kt:53) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner$close$1.invoke(BasicMapsOwner.kt:53) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner.forEachMapSafe(BasicMapsOwner.kt:87) + ... 24 more + Suppressed: java.lang.IllegalArgumentException: this and base files have different roots: C:\Users\Administrator\AppData\Local\Pub\Cache\hosted\pub.flutter-io.cn\emoji_picker_flutter-4.4.0\android\src\main\kotlin\com\fintasys\emoji_picker_flutter\EmojiPickerFlutterPlugin.kt and D:\www\dating_touchme_app\android. + at kotlin.io.FilesKt__UtilsKt.toRelativeString(Utils.kt:117) + at kotlin.io.FilesKt__UtilsKt.relativeTo(Utils.kt:128) + at org.jetbrains.kotlin.incremental.storage.RelocatableFileToPathConverter.toPath(RelocatableFileToPathConverter.kt:24) + at org.jetbrains.kotlin.incremental.storage.FileDescriptor.save(FileToPathConverter.kt:33) + at org.jetbrains.kotlin.incremental.storage.FileDescriptor.save(FileToPathConverter.kt:30) + at org.jetbrains.kotlin.incremental.storage.AppendableCollectionExternalizer.save(LazyStorage.kt:151) + at org.jetbrains.kotlin.incremental.storage.AppendableCollectionExternalizer.save(LazyStorage.kt:142) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.doPut(PersistentMapImpl.java:443) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.put(PersistentMapImpl.java:422) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentHashMap.put(PersistentHashMap.java:105) + at org.jetbrains.kotlin.incremental.storage.LazyStorage.set(LazyStorage.kt:80) + at org.jetbrains.kotlin.incremental.storage.InMemoryStorage.applyChanges(InMemoryStorage.kt:108) + at org.jetbrains.kotlin.incremental.storage.AppendableInMemoryStorage.applyChanges(InMemoryStorage.kt:179) + at org.jetbrains.kotlin.incremental.storage.InMemoryStorage.close(InMemoryStorage.kt:136) + at org.jetbrains.kotlin.incremental.storage.PersistentStorageWrapper.close(PersistentStorage.kt:124) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner$close$1.invoke(BasicMapsOwner.kt:53) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner$close$1.invoke(BasicMapsOwner.kt:53) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner.forEachMapSafe(BasicMapsOwner.kt:87) + ... 24 more + Suppressed: java.lang.Exception: Could not close incremental caches in D:\www\dating_touchme_app\build\emoji_picker_flutter\kotlin\compileDebugKotlin\cacheable\caches-jvm\lookups: id-to-file.tab, file-to-id.tab + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner.forEachMapSafe(BasicMapsOwner.kt:95) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner.close(BasicMapsOwner.kt:53) + at org.jetbrains.kotlin.incremental.LookupStorage.close(LookupStorage.kt:155) + ... 23 more + Suppressed: java.lang.IllegalArgumentException: this and base files have different roots: C:\Users\Administrator\AppData\Local\Pub\Cache\hosted\pub.flutter-io.cn\emoji_picker_flutter-4.4.0\android\src\main\kotlin\com\fintasys\emoji_picker_flutter\EmojiPickerFlutterPlugin.kt and D:\www\dating_touchme_app\android. + at kotlin.io.FilesKt__UtilsKt.toRelativeString(Utils.kt:117) + at kotlin.io.FilesKt__UtilsKt.relativeTo(Utils.kt:128) + at org.jetbrains.kotlin.incremental.storage.RelocatableFileToPathConverter.toPath(RelocatableFileToPathConverter.kt:24) + at org.jetbrains.kotlin.incremental.storage.LegacyFileExternalizer.save(IdToFileMap.kt:51) + at org.jetbrains.kotlin.incremental.storage.LegacyFileExternalizer.save(IdToFileMap.kt:48) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.doPut(PersistentMapImpl.java:443) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.put(PersistentMapImpl.java:422) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentHashMap.put(PersistentHashMap.java:105) + at org.jetbrains.kotlin.incremental.storage.LazyStorage.set(LazyStorage.kt:80) + at org.jetbrains.kotlin.incremental.storage.InMemoryStorage.applyChanges(InMemoryStorage.kt:108) + at org.jetbrains.kotlin.incremental.storage.InMemoryStorage.close(InMemoryStorage.kt:136) + at org.jetbrains.kotlin.incremental.storage.PersistentStorageWrapper.close(PersistentStorage.kt:124) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner$close$1.invoke(BasicMapsOwner.kt:53) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner$close$1.invoke(BasicMapsOwner.kt:53) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner.forEachMapSafe(BasicMapsOwner.kt:87) + ... 25 more + Suppressed: java.lang.IllegalArgumentException: this and base files have different roots: C:\Users\Administrator\AppData\Local\Pub\Cache\hosted\pub.flutter-io.cn\emoji_picker_flutter-4.4.0\android\src\main\kotlin\com\fintasys\emoji_picker_flutter\EmojiPickerFlutterPlugin.kt and D:\www\dating_touchme_app\android. + at kotlin.io.FilesKt__UtilsKt.toRelativeString(Utils.kt:117) + at kotlin.io.FilesKt__UtilsKt.relativeTo(Utils.kt:128) + at org.jetbrains.kotlin.incremental.storage.RelocatableFileToPathConverter.toPath(RelocatableFileToPathConverter.kt:24) + at org.jetbrains.kotlin.incremental.storage.FileDescriptor.getHashCode(FileToPathConverter.kt:50) + at org.jetbrains.kotlin.incremental.storage.FileDescriptor.getHashCode(FileToPathConverter.kt:30) + at org.jetbrains.kotlin.com.intellij.util.containers.LinkedCustomHashMap.hashKey(LinkedCustomHashMap.java:109) + at org.jetbrains.kotlin.com.intellij.util.containers.LinkedCustomHashMap.remove(LinkedCustomHashMap.java:153) + at org.jetbrains.kotlin.com.intellij.util.containers.SLRUMap.remove(SLRUMap.java:89) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.flushAppendCache(PersistentMapImpl.java:999) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.doPut(PersistentMapImpl.java:451) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.put(PersistentMapImpl.java:422) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentHashMap.put(PersistentHashMap.java:105) + at org.jetbrains.kotlin.incremental.storage.LazyStorage.set(LazyStorage.kt:80) + at org.jetbrains.kotlin.incremental.storage.InMemoryStorage.applyChanges(InMemoryStorage.kt:108) + at org.jetbrains.kotlin.incremental.storage.InMemoryStorage.close(InMemoryStorage.kt:136) + at org.jetbrains.kotlin.incremental.storage.PersistentStorageWrapper.close(PersistentStorage.kt:124) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner$close$1.invoke(BasicMapsOwner.kt:53) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner$close$1.invoke(BasicMapsOwner.kt:53) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner.forEachMapSafe(BasicMapsOwner.kt:87) + ... 25 more + Suppressed: java.lang.Exception: Could not close incremental caches in D:\www\dating_touchme_app\build\emoji_picker_flutter\kotlin\compileDebugKotlin\cacheable\caches-jvm\inputs: source-to-output.tab + ... 25 more + Suppressed: java.lang.IllegalArgumentException: this and base files have different roots: C:\Users\Administrator\AppData\Local\Pub\Cache\hosted\pub.flutter-io.cn\emoji_picker_flutter-4.4.0\android\src\main\kotlin\com\fintasys\emoji_picker_flutter\EmojiPickerFlutterPlugin.kt and D:\www\dating_touchme_app\android. + at kotlin.io.FilesKt__UtilsKt.toRelativeString(Utils.kt:117) + at kotlin.io.FilesKt__UtilsKt.relativeTo(Utils.kt:128) + at org.jetbrains.kotlin.incremental.storage.RelocatableFileToPathConverter.toPath(RelocatableFileToPathConverter.kt:24) + at org.jetbrains.kotlin.incremental.storage.FileDescriptor.getHashCode(FileToPathConverter.kt:50) + at org.jetbrains.kotlin.incremental.storage.FileDescriptor.getHashCode(FileToPathConverter.kt:30) + at org.jetbrains.kotlin.com.intellij.util.containers.LinkedCustomHashMap.hashKey(LinkedCustomHashMap.java:109) + at org.jetbrains.kotlin.com.intellij.util.containers.LinkedCustomHashMap.remove(LinkedCustomHashMap.java:153) + at org.jetbrains.kotlin.com.intellij.util.containers.SLRUMap.remove(SLRUMap.java:89) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.flushAppendCache(PersistentMapImpl.java:999) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.doPut(PersistentMapImpl.java:451) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentMapImpl.put(PersistentMapImpl.java:422) + at org.jetbrains.kotlin.com.intellij.util.io.PersistentHashMap.put(PersistentHashMap.java:105) + at org.jetbrains.kotlin.incremental.storage.LazyStorage.set(LazyStorage.kt:80) + at org.jetbrains.kotlin.incremental.storage.InMemoryStorage.applyChanges(InMemoryStorage.kt:108) + at org.jetbrains.kotlin.incremental.storage.AppendableInMemoryStorage.applyChanges(InMemoryStorage.kt:179) + at org.jetbrains.kotlin.incremental.storage.InMemoryStorage.close(InMemoryStorage.kt:136) + at org.jetbrains.kotlin.incremental.storage.AppendableSetBasicMap.close(BasicMap.kt:157) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner$close$1.invoke(BasicMapsOwner.kt:53) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner$close$1.invoke(BasicMapsOwner.kt:53) + at org.jetbrains.kotlin.incremental.storage.BasicMapsOwner.forEachMapSafe(BasicMapsOwner.kt:87) + ... 24 more + + diff --git a/lib/controller/home/event_list_controller.dart b/lib/controller/home/event_list_controller.dart index d4bfc1d..9d4b1b9 100644 --- a/lib/controller/home/event_list_controller.dart +++ b/lib/controller/home/event_list_controller.dart @@ -1,11 +1,13 @@ import 'package:dating_touchme_app/network/home_api.dart'; import 'package:easy_refresh/easy_refresh.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import '../../model/home/event_list_data.dart'; -class EventListController extends GetxController { +class EventListController extends GetxController with GetTickerProviderStateMixin { late final HomeApi _homeApi; @@ -17,10 +19,18 @@ class EventListController extends GetxController { final eventList = [].obs; late final EasyRefreshController listRefreshController; + late final TabController tabController; + + final imgList = [ + "https://dating-agency-prod.oss-cn-shenzhen.aliyuncs.com/57211062B4AA.jpg", + "https://dating-agency-prod.oss-cn-shenzhen.aliyuncs.com/175A787530A6.jpg", + "https://dating-agency-prod.oss-cn-shenzhen.aliyuncs.com/06109B7B681A.jpg" + ].obs; @override void onInit() { super.onInit(); + tabController = TabController(length: 3, vsync: this); _homeApi = Get.find(); listRefreshController = EasyRefreshController( @@ -36,7 +46,7 @@ class EventListController extends GetxController { final response = await _homeApi.userGetSiteActivityPage( pageNum: page.value, pageSize: size.value, - queryType: tab.value == 0 ? 1 : 2 + queryType: tab.value ); if (response.data.isSuccess && response.data.data != null) { final data = response.data.data?.records ?? []; diff --git a/lib/pages/home/event_list.dart b/lib/pages/home/event_list.dart index 622c80e..38538a3 100644 --- a/lib/pages/home/event_list.dart +++ b/lib/pages/home/event_list.dart @@ -1,3 +1,4 @@ +import 'package:cached_network_image/cached_network_image.dart'; import 'package:dating_touchme_app/components/page_appbar.dart'; import 'package:dating_touchme_app/controller/home/event_list_controller.dart'; import 'package:dating_touchme_app/extension/ex_widget.dart'; @@ -8,6 +9,7 @@ import 'package:easy_refresh/easy_refresh.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:tdesign_flutter/tdesign_flutter.dart';import 'package:flutter_swiper_null_safety/flutter_swiper_null_safety.dart'; class EventList extends StatelessWidget { const EventList({super.key}); @@ -58,84 +60,80 @@ class EventList extends StatelessWidget { controller.page.value += 1; await controller.getEventList(); }, - child: Container( - padding: EdgeInsets.all(15.w), - child: Column( - children: [ - Row( - children: [ - Expanded( - child: Container( - height: 50.w, - decoration: BoxDecoration( - border: Border( - bottom: BorderSide(width: 1, color: controller.tab.value == 0 ? const Color.fromRGBO(117, 98, 249, 1) : Colors.black) - ) - ), - child: Center( - child: Text( - "我的活动", - style: TextStyle( - color: controller.tab.value == 0 ? const Color.fromRGBO(117, 98, 249, 1) : const Color.fromRGBO(51, 51, 51, 1) - ), - ), - ), - ).onTap(() async { - if(controller.tab.value == 0) return; - controller.tab.value = 0; - controller.page.value = 1; - controller.eventList.clear(); - await controller.getEventList(); - }), - ), - Expanded( - child: Container( - height: 50.w, + child: SingleChildScrollView( + child: Column( + children: [ + Container( + padding: EdgeInsets.all(15.w), + height: 165.w, + child: Swiper( + autoplay: true, + itemCount: 3, + loop: true, + itemBuilder: (BuildContext context, int index) { + return CachedNetworkImage( + imageUrl: controller.imgList[index], + width: 345.w, + height: 165.w, + fit: BoxFit.cover, + + imageBuilder: (context, imageProvider) => Container( decoration: BoxDecoration( - border: Border( - bottom: BorderSide(width: 1, color: controller.tab.value == 1 ? const Color.fromRGBO(117, 98, 249, 1) : Colors.black) - ) - ), - child: Center( - child: Text( - "全部活动", - style: TextStyle( - color: controller.tab.value == 1 ? const Color.fromRGBO(117, 98, 249, 1) : const Color.fromRGBO(51, 51, 51, 1) - ), + borderRadius: BorderRadius.circular(8), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, ), ), - ).onTap(() async { - if(controller.tab.value == 1) return; - controller.tab.value = 1; - controller.page.value = 1; - controller.eventList.clear(); - await controller.getEventList(); - }), - ), - ], + ), + errorWidget: (context, url, error) => Image.asset( + Assets.imagesUserAvatar, + width: 165.w, + height: 165.w, + fit: BoxFit.cover, + ), + ); + }, ), - SizedBox(height: 15.w,), - Expanded( - child: ListView.builder( - itemCount: controller.eventList.isEmpty ? 1 : controller.eventList.length, - itemBuilder: (_, index) { - if(controller.eventList.isEmpty){ + ), + TDTabBar( + tabs: [ + TDTab(text: '近期活动'), + TDTab(text: '我的活动'), + TDTab(text: '全部活动'), + ], + controller: controller.tabController, + showIndicator: true, + onTap: (int i) async { + if(controller.tab.value == i) return; + controller.tab.value = i; + controller.page.value = 1; + controller.eventList.clear(); + await controller.getEventList(); + }, + ), + ListView.builder( + padding: EdgeInsets.all(15.w), + shrinkWrap: true, // ⭐ 关键 1:高度由内容决定 + physics: const NeverScrollableScrollPhysics(), // ⭐ 关键 2:禁用自身滚动 + itemCount: controller.eventList.isEmpty ? 1 : controller.eventList.length, + itemBuilder: (_, index) { + if(controller.eventList.isEmpty){ - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text('暂无数据'), - ], - ), - ); - } - return EventItem(item: controller.eventList[index],); - }, - ), - ) - ] - ) + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('暂无数据'), + ], + ), + ); + } + return EventItem(item: controller.eventList[index],); + }, + ) + ], + ), ), ), ); diff --git a/lib/pages/home/send_timeline.dart b/lib/pages/home/send_timeline.dart index 2549b0d..c975525 100644 --- a/lib/pages/home/send_timeline.dart +++ b/lib/pages/home/send_timeline.dart @@ -9,6 +9,7 @@ import 'package:dating_touchme_app/generated/assets.dart'; import 'package:dating_touchme_app/network/home_api.dart'; import 'package:dating_touchme_app/oss/oss_manager.dart'; import 'package:dating_touchme_app/widget/emoji_panel.dart'; +import 'package:dating_touchme_app/widget/font_emoji_panel.dart'; import 'package:flustars/flustars.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -333,11 +334,10 @@ class _SendTimelineState extends State { }); } - void handleEmojiSelected(EmojiItem emoji) { + void handleEmojiSelected(String emoji) { // 将表情添加到输入框 final currentText = messageController.text; - final emojiText = '[emoji:${emoji.id}]'; - messageController.text = currentText + emojiText; + messageController.text = currentText + emoji; // 将光标移到末尾 messageController.selection = TextSelection.fromPosition( TextPosition(offset: messageController.text.length), @@ -459,128 +459,78 @@ class _SendTimelineState extends State { ).onTap((){ sendTimeLine(); }),), - body: Container( - padding: EdgeInsets.symmetric(horizontal: 17.w, vertical: 10.w), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Stack( + body: Column( + children: [ + Expanded( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 17.w, vertical: 10.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - TextField( - controller: messageController, - - focusNode: focusNode, - minLines: 1, - maxLines: null, // 关键 - style: TextStyle( - fontSize: 14.sp, - color: messageController.text.contains('[emoji:') - ? Colors.transparent - : Colors.black, - ), - decoration: InputDecoration( - contentPadding: EdgeInsets.symmetric( - vertical: 0, - horizontal: 0 - ), - hintText: "分享你的日常,让缘分更早来临~", - hintStyle: TextStyle( - fontSize: 14.sp, - color: Colors.grey, - ), - border: const OutlineInputBorder( - borderSide: BorderSide.none, // 这将移除边框 // 可选:设置圆角 - ), - // 如果你希望聚焦时和未聚焦时都没有边框,也可以设置 focusedBorder 和 enabledBorder - focusedBorder: const OutlineInputBorder( - borderSide: BorderSide.none, - borderRadius: BorderRadius.all(Radius.circular(8.0)), - ), - enabledBorder: const OutlineInputBorder( - borderSide: BorderSide.none, - borderRadius: BorderRadius.all(Radius.circular(8.0)), - ), - ), - onChanged: (value){ - setState(() { - - }); - }, - ), - if (messageController.text.contains('[emoji:')) - Positioned.fill( - child: IgnorePointer( - child: SingleChildScrollView( - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: buildInputContentWidgets(), + Expanded( + child: Stack( + children: [ + TextField( + controller: messageController, + + focusNode: focusNode, + minLines: 1, + maxLines: null, // 关键 + style: TextStyle( + fontSize: 14.sp, + color: messageController.text.contains('[emoji:') + ? Colors.transparent + : Colors.black, ), + decoration: InputDecoration( + contentPadding: EdgeInsets.symmetric( + vertical: 0, + horizontal: 0 + ), + hintText: "分享你的日常,让缘分更早来临~", + hintStyle: TextStyle( + fontSize: 14.sp, + color: Colors.grey, + ), + border: const OutlineInputBorder( + borderSide: BorderSide.none, // 这将移除边框 // 可选:设置圆角 + ), + // 如果你希望聚焦时和未聚焦时都没有边框,也可以设置 focusedBorder 和 enabledBorder + focusedBorder: const OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.all(Radius.circular(8.0)), + ), + enabledBorder: const OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.all(Radius.circular(8.0)), + ), + ), + onChanged: (value){ + setState(() { + + }); + }, ), - ), - ), - ], - ), - ), - if(imgList.length == 1) Stack( - children: [ - CachedNetworkImage( - imageUrl: imgList[0], - width: 341.w, - height: 341.w, - fit: BoxFit.cover, - - - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover, - ), + if (messageController.text.contains('[emoji:')) + Positioned.fill( + child: IgnorePointer( + child: SingleChildScrollView( + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: buildInputContentWidgets(), + ), + ), + ), + ), + ], ), ), - errorWidget: (context, url, error) => Image.asset( - Assets.imagesUserAvatar, - width: 341.w, - height: 341.w, - fit: BoxFit.cover, - ), - ), - Positioned( - left: 5.w, - top: 5.w, - child: Container( - width: 20.w, - height: 20.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(20.w)), - color: const Color.fromRGBO(0, 0, 0, .3) - ), - child: Icon( - Icons.close, - size: 20.w, - color: Colors.white, - ), - ).onTap((){ - imgList.clear(); - setState(() { - - }); - }), - ) - ], - ), - if(imgList.length == 2) Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ...imgList.map((e){ - return Stack( + if(imgList.length == 1) Stack( children: [ CachedNetworkImage( - imageUrl: e, - width: 165.w, - height: 165.w, + imageUrl: imgList[0], + width: 341.w, + height: 341.w, fit: BoxFit.cover, @@ -595,8 +545,8 @@ class _SendTimelineState extends State { ), errorWidget: (context, url, error) => Image.asset( Assets.imagesUserAvatar, - width: 165.w, - height: 165.w, + width: 341.w, + height: 341.w, fit: BoxFit.cover, ), ), @@ -613,98 +563,155 @@ class _SendTimelineState extends State { child: Icon( Icons.close, size: 20.w, + color: Colors.white, ), ).onTap((){ - imgList.remove(e); + imgList.clear(); setState(() { }); }), ) ], - ); - }), - ], - ), - if(imgList.length > 2) Wrap( - spacing: 13.w, - runSpacing: 13.w, - children: [ - ...imgList.map((e){ - return Stack( + ), + if(imgList.length == 2) Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - CachedNetworkImage( - imageUrl: e, - width: 105.w, - height: 105.w, - fit: BoxFit.cover, + ...imgList.map((e){ + return Stack( + children: [ + CachedNetworkImage( + imageUrl: e, + width: 165.w, + height: 165.w, + fit: BoxFit.cover, - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + errorWidget: (context, url, error) => Image.asset( + Assets.imagesUserAvatar, + width: 165.w, + height: 165.w, + fit: BoxFit.cover, + ), ), - ), - ), - errorWidget: (context, url, error) => Image.asset( - Assets.imagesUserAvatar, - width: 105.w, - height: 105.w, - fit: BoxFit.cover, - ), - ), - Positioned( - left: 5.w, - top: 5.w, - child: Container( - width: 20.w, - height: 20.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(20.w)), - color: const Color.fromRGBO(0, 0, 0, .3) - ), - child: Icon( - Icons.close, - size: 20.w, - ), - ).onTap((){ - imgList.remove(e); - setState(() { + Positioned( + left: 5.w, + top: 5.w, + child: Container( + width: 20.w, + height: 20.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(20.w)), + color: const Color.fromRGBO(0, 0, 0, .3) + ), + child: Icon( + Icons.close, + size: 20.w, + ), + ).onTap((){ + imgList.remove(e); + setState(() { + + }); + }), + ) + ], + ); + }), + ], + ), + if(imgList.length > 2) Wrap( + spacing: 13.w, + runSpacing: 13.w, + children: [ + ...imgList.map((e){ + return Stack( + children: [ + CachedNetworkImage( + imageUrl: e, + width: 105.w, + height: 105.w, + fit: BoxFit.cover, - }); - }), - ) + + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + errorWidget: (context, url, error) => Image.asset( + Assets.imagesUserAvatar, + width: 105.w, + height: 105.w, + fit: BoxFit.cover, + ), + ), + Positioned( + left: 5.w, + top: 5.w, + child: Container( + width: 20.w, + height: 20.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(20.w)), + color: const Color.fromRGBO(0, 0, 0, .3) + ), + child: Icon( + Icons.close, + size: 20.w, + ), + ).onTap((){ + imgList.remove(e); + setState(() { + + }); + }), + ) + ], + ); + }), ], - ); - }), - ], - ), - Row( - children: [ - Image.asset( - Assets.imagesImg, - width: 20.w, - ).onTap(() { - _showAvatarPopup(); - }), - SizedBox(width: 25.w,), - Image.asset( - Assets.imagesEmoji, - width: 18.w, - ).onTap(toggleEmojiPanel) - ], - ), + ), + Row( + children: [ + Image.asset( + Assets.imagesImg, + width: 20.w, + ).onTap(() { + _showAvatarPopup(); + }), + SizedBox(width: 25.w,), + Image.asset( + Assets.imagesEmoji, + width: 18.w, + ).onTap(toggleEmojiPanel) + ], + ), - // 表情面板 - EmojiPanel( - isVisible: isEmojiVisible, - onEmojiSelected: handleEmojiSelected, + ], + ), ), - ], - ), + ), + + // 表情面板 + FontEmojiPanel( + isVisible: isEmojiVisible, + onEmojiSelected: handleEmojiSelected, + ), + ], ), ); } diff --git a/lib/pages/home/timeline_window.dart b/lib/pages/home/timeline_window.dart index 6bdf974..bbf72d9 100644 --- a/lib/pages/home/timeline_window.dart +++ b/lib/pages/home/timeline_window.dart @@ -30,41 +30,6 @@ class _TimelineWindowState extends State with AutomaticKeepAlive super.build(context); return Column( children: [ - TDTabBar( - tabs: [ - TDTab( - child: Padding( - padding: EdgeInsets.only(right: 16, left: 16), - child: Text('全部'), - ), - ), - TDTab( - child: Padding( - padding: EdgeInsets.only(right: 16, left: 16), - child: Text('好友动态'), - ), - ), - ], - backgroundColor: Colors.transparent, - labelPadding: const EdgeInsets.only(right: 4, top: 10, bottom: 10, left: 4), - selectedBgColor: const Color.fromRGBO(108, 105, 244, 1), - unSelectedBgColor: Colors.transparent, - labelColor: Colors.white, - dividerHeight: 0, - tabAlignment: TabAlignment.start, - outlineType: TDTabBarOutlineType.capsule, - controller: tabController, - showIndicator: false, - isScrollable: true, - onTap: (index) async { - print('相亲页面 Tab: $index'); - if (controller.timelineTab.value != index) { - controller.setTimelineTab(index); - // 确保状态更新后刷新UI - controller.update(); - } - }, - ), Expanded( child: Obx(() { // 使用 IndexedStack 保持两个列表的状态,根据当前选中的标签显示对应的列表 diff --git a/lib/pages/home/user_information_page.dart b/lib/pages/home/user_information_page.dart index 7d41bcb..375c97b 100644 --- a/lib/pages/home/user_information_page.dart +++ b/lib/pages/home/user_information_page.dart @@ -375,16 +375,16 @@ class UserInformationPage extends StatelessWidget { color: const Color.fromRGBO(144, 144, 144, 1) ), ), - SizedBox(height: 11.w,), - Wrap( - spacing: 12.w, - runSpacing: 12.w, - children: [ - ...controller.tagList.map((e){ - return TagItem(label: e); - }), - ], - ), + // SizedBox(height: 11.w,), + // Wrap( + // spacing: 12.w, + // runSpacing: 12.w, + // children: [ + // ...controller.tagList.map((e){ + // return TagItem(label: e); + // }), + // ], + // ), SizedBox(height: 16.w,), if ((controller.userData.value.provinceName?.isNotEmpty ?? false)) Text( "IP属地:${controller.userData.value.provinceName}", diff --git a/lib/pages/setting/setting_page.dart b/lib/pages/setting/setting_page.dart index 9823b85..3043ca7 100644 --- a/lib/pages/setting/setting_page.dart +++ b/lib/pages/setting/setting_page.dart @@ -67,7 +67,12 @@ class SettingPage extends StatelessWidget { if(false) TDCell(arrow: true, title: '隐私设置', onClick: (cell) { SmartDialog.showToast('功能暂未开放'); },), - TDCell(arrow: true, title: '青少年模式${controller.x.value}', onClick: (cell) { + TDCell(arrow: true ,titleWidget: Text( + "青少年模式${controller.x.value}", + style: TextStyle( + fontSize: 14.w + ), + ), onClick: (cell) { Get.to(() => TeenagerModePage()); },), ], @@ -76,20 +81,40 @@ class SettingPage extends StatelessWidget { TDCellGroup( theme: TDCellGroupTheme.cardTheme, cells: [ - TDCell(arrow: true, title: '系统权限管理', onClick: (cell) { + TDCell(arrow: true, titleWidget: Text( + "系统权限管理", + style: TextStyle( + fontSize: 14.w + ), + ), onClick: (cell) { openAppSettings(); },), - TDCell(arrow: true, title: '消息通知', onClick: (cell) { + TDCell(arrow: true, titleWidget: Text( + "消息通知", + style: TextStyle( + fontSize: 14.w + ), + ), onClick: (cell) { // Get.to(() => NoticePage()); openAppSettings(); }), - TDCell(arrow: true, title: '用户协议', onClick: (cell) { + TDCell(arrow: true, titleWidget: Text( + "用户协议", + style: TextStyle( + fontSize: 14.w + ), + ), onClick: (cell) { // Get.to(() => NoticePage()); Get.to(() => OpenWebView(url: "https://www.quzhaoqin.com/privacy.html")); }), - TDCell(arrow: true, title: '隐私政策', onClick: (cell) { + TDCell(arrow: true, titleWidget: Text( + "隐私政策", + style: TextStyle( + fontSize: 14.w + ), + ), onClick: (cell) { // Get.to(() => NoticePage()); Get.to(() => OpenWebView(url: "https://www.quzhaoqin.com/information.html")); @@ -107,7 +132,12 @@ class SettingPage extends StatelessWidget { TDCellGroup( theme: TDCellGroupTheme.cardTheme, cells: [ - TDCell(arrow: true, title: '退出登录', onClick: (cell){ + TDCell(arrow: true,titleWidget: Text( + "退出登录", + style: TextStyle( + fontSize: 14.w + ), + ), onClick: (cell){ showGeneralDialog( context: context, pageBuilder: (BuildContext buildContext, Animation< @@ -168,8 +198,7 @@ class SettingPage extends StatelessWidget { "账号注销", style: TextStyle( color: const Color.fromRGBO(248, 85, 66, 1), - fontSize: TDTheme.of(context).fontBodyLarge?.size ?? 16, - height: TDTheme.of(context).fontBodyLarge?.height ?? 24, + fontSize: 14.w, fontWeight: FontWeight.w400, ), ), onClick: (cell){ diff --git a/lib/widget/font_emoji_panel.dart b/lib/widget/font_emoji_panel.dart new file mode 100644 index 0000000..0fe69b0 --- /dev/null +++ b/lib/widget/font_emoji_panel.dart @@ -0,0 +1,87 @@ +import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; +import 'package:flutter/foundation.dart' as foundation; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import '../config/emoji_config.dart'; +import '../generated/assets.dart'; + +/// 表情选择面板 +class FontEmojiPanel extends StatefulWidget { + final Function(String emoji) onEmojiSelected; + final bool isVisible; + + const FontEmojiPanel({ + super.key, + required this.onEmojiSelected, + required this.isVisible, + }); + + @override + State createState() => _FontEmojiPanelState(); +} + +class _FontEmojiPanelState extends State { + + + + final _controller = TextEditingController(); + final _scrollController = ScrollController(); + + @override + Widget build(BuildContext context) { + if (!widget.isVisible) { + return const SizedBox.shrink(); + } + + final hasRecent = EmojiConfig.hasRecentEmojis(); + final List recentEmojis = hasRecent ? EmojiConfig.getRecentEmojis() : []; + + return AnimatedContainer( + duration: const Duration(milliseconds: 200), + height: widget.isVisible ? 320.h : 0, + color: Colors.white, + child: EmojiPicker( + onEmojiSelected: (Category? category, Emoji emoji) { + print(category); + print(emoji.emoji); + widget.onEmojiSelected(emoji.emoji); + setState(() { + + }); + }, + onBackspacePressed: () { + // Do something when the user taps the backspace button (optional) + // Set it to null to hide the Backspace-Button + }, + textEditingController: _controller, + scrollController: _scrollController, + config: Config( + locale: const Locale("zh"), + height: widget.isVisible ? 320.h : 0, + checkPlatformCompatibility: true, + viewOrderConfig: const ViewOrderConfig(), + emojiViewConfig: EmojiViewConfig( + // Issue: https://github.com/flutter/flutter/issues/28894 + emojiSizeMax: 28 * + (foundation.defaultTargetPlatform == + TargetPlatform.iOS + ? 1.2 + : 1.0), + noRecents: Text( + '暂无最近使用', + style: TextStyle(fontSize: 20, color: Colors.black26), + textAlign: TextAlign.center, + ) + ), + skinToneConfig: const SkinToneConfig(), + categoryViewConfig: const CategoryViewConfig(), + bottomActionBarConfig: const BottomActionBarConfig( + enabled: false + ), + searchViewConfig: const SearchViewConfig(), + ), + ), + ); + } + +} diff --git a/pubspec.yaml b/pubspec.yaml index 0781d83..a47de6e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -78,6 +78,7 @@ dependencies: pinput: ^6.0.1 im_flutter_sdk: 4.15.2 webview_flutter: ^4.13.0 + emoji_picker_flutter: ^4.3.0 dev_dependencies: flutter_test: