Browse Source

优化帖子,优化活动排版,优化自提日央视

ios
王子贤 2 months ago
parent
commit
456ec4ecde
9 changed files with 619 additions and 324 deletions
  1. 198
      android/.kotlin/errors/errors-1767774610166.log
  2. 14
      lib/controller/home/event_list_controller.dart
  3. 144
      lib/pages/home/event_list.dart
  4. 399
      lib/pages/home/send_timeline.dart
  5. 35
      lib/pages/home/timeline_window.dart
  6. 20
      lib/pages/home/user_information_page.dart
  7. 45
      lib/pages/setting/setting_page.dart
  8. 87
      lib/widget/font_emoji_panel.dart
  9. 1
      pubspec.yaml

198
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

14
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 = <Records>[].obs;
late final EasyRefreshController listRefreshController;
late final TabController tabController;
final imgList = <String>[
"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<HomeApi>();
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 ?? [];

144
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],);
},
)
],
),
),
),
);

399
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<SendTimeline> {
});
}
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<SendTimeline> {
).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<SendTimeline> {
),
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<SendTimeline> {
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,
),
],
),
);
}

35
lib/pages/home/timeline_window.dart

@ -30,41 +30,6 @@ class _TimelineWindowState extends State<TimelineWindow> 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

20
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}",

45
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){

87
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<FontEmojiPanel> createState() => _FontEmojiPanelState();
}
class _FontEmojiPanelState extends State<FontEmojiPanel> {
final _controller = TextEditingController();
final _scrollController = ScrollController();
@override
Widget build(BuildContext context) {
if (!widget.isVisible) {
return const SizedBox.shrink();
}
final hasRecent = EmojiConfig.hasRecentEmojis();
final List<EmojiItem> 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(),
),
),
);
}
}

1
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:

Loading…
Cancel
Save