diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json index ab2d1f9..3735767 100644 --- a/.dart_tool/package_config.json +++ b/.dart_tool/package_config.json @@ -3,865 +3,865 @@ "packages": [ { "name": "_fe_analyzer_shared", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-93.0.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/_fe_analyzer_shared-93.0.0", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "analyzer", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/analyzer-10.0.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/analyzer-10.0.1", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "archive", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/archive-4.0.9", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/archive-4.0.9", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "args", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/args-2.7.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/args-2.7.0", "packageUri": "lib/", "languageVersion": "3.3" }, { "name": "async", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/async-2.13.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/async-2.13.1", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "boolean_selector", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/boolean_selector-2.1.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/boolean_selector-2.1.2", "packageUri": "lib/", "languageVersion": "3.1" }, { "name": "build", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/build-4.0.5", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/build-4.0.5", "packageUri": "lib/", "languageVersion": "3.7" }, { "name": "build_config", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/build_config-1.3.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/build_config-1.3.0", "packageUri": "lib/", "languageVersion": "3.7" }, { "name": "build_daemon", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/build_daemon-4.1.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/build_daemon-4.1.1", "packageUri": "lib/", "languageVersion": "3.7" }, { "name": "build_runner", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/build_runner-2.14.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/build_runner-2.14.0", "packageUri": "lib/", "languageVersion": "3.7" }, { "name": "built_collection", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/built_collection-5.1.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/built_collection-5.1.1", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "built_value", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/built_value-8.12.5", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/built_value-8.12.5", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "cached_network_image", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/cached_network_image-3.4.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/cached_network_image-3.4.1", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "cached_network_image_platform_interface", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/cached_network_image_platform_interface-4.1.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/cached_network_image_platform_interface-4.1.1", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "cached_network_image_web", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/cached_network_image_web-1.3.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/cached_network_image_web-1.3.1", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "characters", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/characters-1.4.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/characters-1.4.1", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "checked_yaml", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/checked_yaml-2.0.4", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/checked_yaml-2.0.4", "packageUri": "lib/", "languageVersion": "3.8" }, { "name": "clock", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/clock-1.1.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/clock-1.1.2", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "code_assets", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/code_assets-1.0.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/code_assets-1.0.0", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "collection", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/collection-1.19.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/collection-1.19.1", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "convert", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/convert-3.1.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/convert-3.1.2", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "crypto", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/crypto-3.0.7", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/crypto-3.0.7", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "dart_style", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/dart_style-3.1.7", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/dart_style-3.1.7", "packageUri": "lib/", "languageVersion": "3.10" }, { "name": "dart_twitter_api", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/dart_twitter_api-0.6.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/dart_twitter_api-0.6.0", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "dbus", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/dbus-0.7.12", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/dbus-0.7.12", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "fake_async", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/fake_async-1.3.3", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/fake_async-1.3.3", "packageUri": "lib/", "languageVersion": "3.3" }, { "name": "ffcache", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/ffcache-1.1.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/ffcache-1.1.0", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "ffi", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/ffi-2.2.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/ffi-2.2.0", "packageUri": "lib/", "languageVersion": "3.7" }, { "name": "ffi_leak_tracker", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/ffi_leak_tracker-0.1.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/ffi_leak_tracker-0.1.2", "packageUri": "lib/", "languageVersion": "3.10" }, { "name": "file", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/file-7.0.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/file-7.0.1", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "fixnum", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/fixnum-1.1.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/fixnum-1.1.1", "packageUri": "lib/", "languageVersion": "3.1" }, { "name": "flutter", - "rootUri": "file:///home/likun/develop/flutter/packages/flutter", + "rootUri": "file:///opt/flutter/packages/flutter", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "flutter_cache_manager", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/flutter_cache_manager-3.4.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/flutter_cache_manager-3.4.1", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "flutter_lints", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/flutter_lints-3.0.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/flutter_lints-3.0.2", "packageUri": "lib/", "languageVersion": "3.1" }, { "name": "flutter_riverpod", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/flutter_riverpod-2.6.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/flutter_riverpod-2.6.1", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "flutter_test", - "rootUri": "file:///home/likun/develop/flutter/packages/flutter_test", + "rootUri": "file:///opt/flutter/packages/flutter_test", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "flutter_web_plugins", - "rootUri": "file:///home/likun/develop/flutter/packages/flutter_web_plugins", + "rootUri": "file:///opt/flutter/packages/flutter_web_plugins", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "glob", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/glob-2.1.3", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/glob-2.1.3", "packageUri": "lib/", "languageVersion": "3.3" }, { "name": "graphs", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/graphs-2.3.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/graphs-2.3.2", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "hooks", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/hooks-1.0.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/hooks-1.0.2", "packageUri": "lib/", "languageVersion": "3.10" }, { "name": "http", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/http-1.6.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/http-1.6.0", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "http_multi_server", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/http_multi_server-3.2.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/http_multi_server-3.2.2", "packageUri": "lib/", "languageVersion": "3.2" }, { "name": "http_parser", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/http_parser-4.1.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/http_parser-4.1.2", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "idb_shim", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/idb_shim-2.8.5+2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/idb_shim-2.8.5+2", "packageUri": "lib/", "languageVersion": "3.10" }, { "name": "image", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/image-4.8.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/image-4.8.0", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "intl", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/intl-0.20.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/intl-0.20.2", "packageUri": "lib/", "languageVersion": "3.3" }, { "name": "io", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/io-1.0.5", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/io-1.0.5", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "jni", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/jni-1.0.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/jni-1.0.0", "packageUri": "lib/", "languageVersion": "3.3" }, { "name": "jni_flutter", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1", "packageUri": "lib/", "languageVersion": "3.3" }, { "name": "json_annotation", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/json_annotation-4.11.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/json_annotation-4.11.0", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "json_serializable", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/json_serializable-6.13.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/json_serializable-6.13.1", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "leak_tracker", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/leak_tracker-11.0.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/leak_tracker-11.0.2", "packageUri": "lib/", "languageVersion": "3.2" }, { "name": "leak_tracker_flutter_testing", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.10", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-3.0.10", "packageUri": "lib/", "languageVersion": "3.2" }, { "name": "leak_tracker_testing", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/leak_tracker_testing-3.0.2", "packageUri": "lib/", "languageVersion": "3.2" }, { "name": "lints", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/lints-3.0.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/lints-3.0.0", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "logging", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/logging-1.3.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/logging-1.3.0", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "matcher", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/matcher-0.12.19", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/matcher-0.12.18", "packageUri": "lib/", "languageVersion": "3.7" }, { "name": "material_color_utilities", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/material_color_utilities-0.13.0", "packageUri": "lib/", "languageVersion": "3.5" }, { "name": "media_kit", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/media_kit-1.2.6", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/media_kit-1.2.6", "packageUri": "lib/", "languageVersion": "3.1" }, { "name": "media_kit_libs_android_video", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/media_kit_libs_android_video-1.3.8", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/media_kit_libs_android_video-1.3.8", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "media_kit_libs_ios_video", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/media_kit_libs_ios_video-1.1.4", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/media_kit_libs_ios_video-1.1.4", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "media_kit_libs_linux", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/media_kit_libs_linux-1.2.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/media_kit_libs_linux-1.2.1", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "media_kit_libs_macos_video", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/media_kit_libs_macos_video-1.1.4", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/media_kit_libs_macos_video-1.1.4", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "media_kit_libs_video", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/media_kit_libs_video-1.0.7", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/media_kit_libs_video-1.0.7", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "media_kit_libs_windows_video", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/media_kit_libs_windows_video-1.0.11", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/media_kit_libs_windows_video-1.0.11", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "media_kit_video", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/media_kit_video-1.3.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/media_kit_video-1.3.1", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "meta", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/meta-1.17.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/meta-1.17.0", "packageUri": "lib/", "languageVersion": "3.5" }, { "name": "mime", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/mime-2.0.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/mime-2.0.0", "packageUri": "lib/", "languageVersion": "3.2" }, { "name": "native_toolchain_c", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/native_toolchain_c-0.17.6", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/native_toolchain_c-0.17.6", "packageUri": "lib/", "languageVersion": "3.10" }, { "name": "oauth1", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/oauth1-2.1.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/oauth1-2.1.0", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "objective_c", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/objective_c-9.3.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/objective_c-9.3.0", "packageUri": "lib/", "languageVersion": "3.10" }, { "name": "octo_image", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/octo_image-2.1.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/octo_image-2.1.0", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "package_config", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/package_config-2.2.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/package_config-2.2.0", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "package_info_plus", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/package_info_plus-10.0.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/package_info_plus-10.0.0", "packageUri": "lib/", "languageVersion": "3.11" }, { "name": "package_info_plus_platform_interface", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/package_info_plus_platform_interface-4.0.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/package_info_plus_platform_interface-4.0.0", "packageUri": "lib/", "languageVersion": "3.11" }, { "name": "path", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/path-1.9.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/path-1.9.1", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "path_provider", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/path_provider-2.1.5", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/path_provider-2.1.5", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "path_provider_android", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "path_provider_foundation", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0", "packageUri": "lib/", "languageVersion": "3.10" }, { "name": "path_provider_linux", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1", "packageUri": "lib/", "languageVersion": "2.19" }, { "name": "path_provider_platform_interface", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.1.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/path_provider_platform_interface-2.1.2", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "path_provider_windows", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0", "packageUri": "lib/", "languageVersion": "3.2" }, { "name": "petitparser", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/petitparser-7.0.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/petitparser-7.0.2", "packageUri": "lib/", "languageVersion": "3.8" }, { "name": "platform", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/platform-3.1.6", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/platform-3.1.6", "packageUri": "lib/", "languageVersion": "3.2" }, { "name": "plugin_platform_interface", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.8", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/plugin_platform_interface-2.1.8", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "pool", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/pool-1.5.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/pool-1.5.2", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "posix", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/posix-6.5.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/posix-6.5.0", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "pub_semver", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/pub_semver-2.2.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/pub_semver-2.2.0", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "pubspec_parse", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/pubspec_parse-1.5.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/pubspec_parse-1.5.0", "packageUri": "lib/", "languageVersion": "3.6" }, { "name": "quiver", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/quiver-3.2.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/quiver-3.2.2", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "riverpod", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/riverpod-2.6.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/riverpod-2.6.1", "packageUri": "lib/", "languageVersion": "2.17" }, { "name": "rxdart", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/rxdart-0.28.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/rxdart-0.28.0", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "safe_local_storage", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/safe_local_storage-2.0.3", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/safe_local_storage-2.0.3", "packageUri": "lib/", "languageVersion": "2.16" }, { "name": "screen_brightness_android", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "screen_brightness_platform_interface", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/screen_brightness_platform_interface-2.1.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/screen_brightness_platform_interface-2.1.0", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "sembast", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/sembast-3.8.6", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/sembast-3.8.6", "packageUri": "lib/", "languageVersion": "3.10" }, { "name": "shared_preferences", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/shared_preferences-2.5.5", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/shared_preferences-2.5.5", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "shared_preferences_android", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.23", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.23", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "shared_preferences_foundation", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "shared_preferences_linux", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1", "packageUri": "lib/", "languageVersion": "3.3" }, { "name": "shared_preferences_platform_interface", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/shared_preferences_platform_interface-2.4.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/shared_preferences_platform_interface-2.4.2", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "shared_preferences_web", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "shared_preferences_windows", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1", "packageUri": "lib/", "languageVersion": "3.3" }, { "name": "shelf", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/shelf-1.4.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/shelf-1.4.2", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "shelf_web_socket", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/shelf_web_socket-3.0.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/shelf_web_socket-3.0.0", "packageUri": "lib/", "languageVersion": "3.5" }, { "name": "sky_engine", - "rootUri": "file:///home/likun/develop/flutter/bin/cache/pkg/sky_engine", + "rootUri": "file:///opt/flutter/bin/cache/pkg/sky_engine", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "source_gen", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/source_gen-4.2.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/source_gen-4.2.2", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "source_helper", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/source_helper-1.3.11", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/source_helper-1.3.11", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "source_span", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/source_span-1.10.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/source_span-1.10.2", "packageUri": "lib/", "languageVersion": "3.1" }, { "name": "sqflite", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/sqflite-2.4.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/sqflite-2.4.2", "packageUri": "lib/", "languageVersion": "3.7" }, { "name": "sqflite_android", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+3", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+3", "packageUri": "lib/", "languageVersion": "3.10" }, { "name": "sqflite_common", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/sqflite_common-2.5.6", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/sqflite_common-2.5.6", "packageUri": "lib/", "languageVersion": "3.8" }, { "name": "sqflite_darwin", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2", "packageUri": "lib/", "languageVersion": "3.7" }, { "name": "sqflite_platform_interface", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/sqflite_platform_interface-2.4.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/sqflite_platform_interface-2.4.0", "packageUri": "lib/", "languageVersion": "3.5" }, { "name": "stack_trace", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/stack_trace-1.12.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/stack_trace-1.12.1", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "state_notifier", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/state_notifier-1.0.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/state_notifier-1.0.0", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "stream_channel", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/stream_channel-2.1.4", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/stream_channel-2.1.4", "packageUri": "lib/", "languageVersion": "3.3" }, { "name": "stream_transform", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/stream_transform-2.1.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/stream_transform-2.1.1", "packageUri": "lib/", "languageVersion": "3.1" }, { "name": "string_scanner", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/string_scanner-1.4.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/string_scanner-1.4.1", "packageUri": "lib/", "languageVersion": "3.1" }, { "name": "synchronized", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/synchronized-3.4.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/synchronized-3.4.0", "packageUri": "lib/", "languageVersion": "3.8" }, { "name": "term_glyph", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/term_glyph-1.2.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/term_glyph-1.2.2", "packageUri": "lib/", "languageVersion": "3.1" }, { "name": "test_api", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/test_api-0.7.10", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/test_api-0.7.9", "packageUri": "lib/", "languageVersion": "3.7" }, { "name": "typed_data", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/typed_data-1.4.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/typed_data-1.4.0", "packageUri": "lib/", "languageVersion": "3.5" }, { "name": "universal_platform", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/universal_platform-1.1.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/universal_platform-1.1.0", "packageUri": "lib/", "languageVersion": "2.12" }, { "name": "uri_parser", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/uri_parser-3.0.2", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/uri_parser-3.0.2", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "uuid", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/uuid-4.5.3", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/uuid-4.5.3", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "vector_math", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/vector_math-2.2.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/vector_math-2.2.0", "packageUri": "lib/", "languageVersion": "3.1" }, { "name": "vm_service", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/vm_service-15.1.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/vm_service-15.1.0", "packageUri": "lib/", "languageVersion": "3.5" }, { "name": "volume_controller", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/volume_controller-3.4.4", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/volume_controller-3.4.4", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "wakelock_plus", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/wakelock_plus-1.6.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/wakelock_plus-1.6.0", "packageUri": "lib/", "languageVersion": "3.11" }, { "name": "wakelock_plus_platform_interface", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/wakelock_plus_platform_interface-1.5.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/wakelock_plus_platform_interface-1.5.0", "packageUri": "lib/", "languageVersion": "3.11" }, { "name": "watcher", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/watcher-1.2.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/watcher-1.2.1", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "web", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/web-1.1.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/web-1.1.1", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "web_socket", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/web_socket-1.0.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/web_socket-1.0.1", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "web_socket_channel", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/web_socket_channel-3.0.3", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/web_socket_channel-3.0.3", "packageUri": "lib/", "languageVersion": "3.3" }, { "name": "webview_cookie_manager_plus", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/webview_cookie_manager_plus-2.0.17", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/webview_cookie_manager_plus-2.0.17", "packageUri": "lib/", "languageVersion": "3.0" }, { "name": "webview_flutter", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/webview_flutter-4.13.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/webview_flutter-4.13.1", "packageUri": "lib/", "languageVersion": "3.8" }, { "name": "webview_flutter_android", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/webview_flutter_android-4.11.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/webview_flutter_android-4.11.0", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "webview_flutter_platform_interface", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/webview_flutter_platform_interface-2.15.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/webview_flutter_platform_interface-2.15.1", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "webview_flutter_wkwebview", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.24.5", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.24.5", "packageUri": "lib/", "languageVersion": "3.9" }, { "name": "win32", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/win32-6.0.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/win32-6.0.1", "packageUri": "lib/", "languageVersion": "3.10" }, { "name": "xdg_directories", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/xdg_directories-1.1.0", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/xdg_directories-1.1.0", "packageUri": "lib/", "languageVersion": "3.3" }, { "name": "xml", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/xml-6.6.1", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/xml-6.6.1", "packageUri": "lib/", "languageVersion": "3.8" }, { "name": "yaml", - "rootUri": "file:///home/likun/.pub-cache/hosted/pub.dev/yaml-3.1.3", + "rootUri": "file:///home/jules/.pub-cache/hosted/pub.dev/yaml-3.1.3", "packageUri": "lib/", "languageVersion": "3.4" }, @@ -873,8 +873,8 @@ } ], "generator": "pub", - "generatorVersion": "3.11.5", - "flutterRoot": "file:///home/likun/develop/flutter", - "flutterVersion": "3.41.7", - "pubCache": "file:///home/likun/.pub-cache" + "generatorVersion": "3.11.0", + "flutterRoot": "file:///opt/flutter", + "flutterVersion": "3.41.2", + "pubCache": "file:///home/jules/.pub-cache" } diff --git a/.dart_tool/package_graph.json b/.dart_tool/package_graph.json index cccc7c9..51b4f07 100644 --- a/.dart_tool/package_graph.json +++ b/.dart_tool/package_graph.json @@ -654,7 +654,7 @@ }, { "name": "matcher", - "version": "0.12.19", + "version": "0.12.18", "dependencies": [ "async", "meta", @@ -665,7 +665,7 @@ }, { "name": "test_api", - "version": "0.7.10", + "version": "0.7.9", "dependencies": [ "async", "boolean_selector", diff --git a/.dart_tool/version b/.dart_tool/version index b0e9fea..2624404 100644 --- a/.dart_tool/version +++ b/.dart_tool/version @@ -1 +1 @@ -3.41.7 \ No newline at end of file +3.41.2 \ No newline at end of file diff --git a/.flutter-plugins-dependencies b/.flutter-plugins-dependencies index c9d9841..eea95ca 100644 --- a/.flutter-plugins-dependencies +++ b/.flutter-plugins-dependencies @@ -1 +1 @@ -{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"media_kit_libs_ios_video","path":"/home/likun/.pub-cache/hosted/pub.dev/media_kit_libs_ios_video-1.1.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_video","path":"/home/likun/.pub-cache/hosted/pub.dev/media_kit_video-1.3.1/","native_build":true,"dependencies":["wakelock_plus","volume_controller"],"dev_dependency":false},{"name":"package_info_plus","path":"/home/likun/.pub-cache/hosted/pub.dev/package_info_plus-10.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/home/likun/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/home/likun/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"sqflite_darwin","path":"/home/likun/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"volume_controller","path":"/home/likun/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/home/likun/.pub-cache/hosted/pub.dev/wakelock_plus-1.6.0/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false},{"name":"webview_cookie_manager_plus","path":"/home/likun/.pub-cache/hosted/pub.dev/webview_cookie_manager_plus-2.0.17/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"webview_flutter_wkwebview","path":"/home/likun/.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.24.5/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false}],"android":[{"name":"jni","path":"/home/likun/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni_flutter","path":"/home/likun/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/","native_build":true,"dependencies":["jni"],"dev_dependency":false},{"name":"media_kit_libs_android_video","path":"/home/likun/.pub-cache/hosted/pub.dev/media_kit_libs_android_video-1.3.8/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_video","path":"/home/likun/.pub-cache/hosted/pub.dev/media_kit_video-1.3.1/","native_build":true,"dependencies":["wakelock_plus","screen_brightness_android","volume_controller"],"dev_dependency":false},{"name":"package_info_plus","path":"/home/likun/.pub-cache/hosted/pub.dev/package_info_plus-10.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_android","path":"/home/likun/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/","native_build":false,"dependencies":["jni","jni_flutter"],"dev_dependency":false},{"name":"screen_brightness_android","path":"/home/likun/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_android","path":"/home/likun/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.23/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"sqflite_android","path":"/home/likun/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"volume_controller","path":"/home/likun/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/home/likun/.pub-cache/hosted/pub.dev/wakelock_plus-1.6.0/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false},{"name":"webview_cookie_manager_plus","path":"/home/likun/.pub-cache/hosted/pub.dev/webview_cookie_manager_plus-2.0.17/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"webview_flutter_android","path":"/home/likun/.pub-cache/hosted/pub.dev/webview_flutter_android-4.11.0/","native_build":true,"dependencies":[],"dev_dependency":false}],"macos":[{"name":"media_kit_libs_macos_video","path":"/home/likun/.pub-cache/hosted/pub.dev/media_kit_libs_macos_video-1.1.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_video","path":"/home/likun/.pub-cache/hosted/pub.dev/media_kit_video-1.3.1/","native_build":true,"dependencies":["wakelock_plus","volume_controller"],"dev_dependency":false},{"name":"package_info_plus","path":"/home/likun/.pub-cache/hosted/pub.dev/package_info_plus-10.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/home/likun/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/home/likun/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"sqflite_darwin","path":"/home/likun/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"volume_controller","path":"/home/likun/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/home/likun/.pub-cache/hosted/pub.dev/wakelock_plus-1.6.0/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false},{"name":"webview_flutter_wkwebview","path":"/home/likun/.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.24.5/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false}],"linux":[{"name":"jni","path":"/home/likun/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_libs_linux","path":"/home/likun/.pub-cache/hosted/pub.dev/media_kit_libs_linux-1.2.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_video","path":"/home/likun/.pub-cache/hosted/pub.dev/media_kit_video-1.3.1/","native_build":true,"dependencies":["wakelock_plus","volume_controller"],"dev_dependency":false},{"name":"package_info_plus","path":"/home/likun/.pub-cache/hosted/pub.dev/package_info_plus-10.0.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"path_provider_linux","path":"/home/likun/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_linux","path":"/home/likun/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1/","native_build":false,"dependencies":["path_provider_linux"],"dev_dependency":false},{"name":"volume_controller","path":"/home/likun/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/home/likun/.pub-cache/hosted/pub.dev/wakelock_plus-1.6.0/","native_build":false,"dependencies":["package_info_plus"],"dev_dependency":false}],"windows":[{"name":"jni","path":"/home/likun/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_libs_windows_video","path":"/home/likun/.pub-cache/hosted/pub.dev/media_kit_libs_windows_video-1.0.11/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_video","path":"/home/likun/.pub-cache/hosted/pub.dev/media_kit_video-1.3.1/","native_build":true,"dependencies":["wakelock_plus","volume_controller"],"dev_dependency":false},{"name":"package_info_plus","path":"/home/likun/.pub-cache/hosted/pub.dev/package_info_plus-10.0.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"path_provider_windows","path":"/home/likun/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_windows","path":"/home/likun/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1/","native_build":false,"dependencies":["path_provider_windows"],"dev_dependency":false},{"name":"volume_controller","path":"/home/likun/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/home/likun/.pub-cache/hosted/pub.dev/wakelock_plus-1.6.0/","native_build":false,"dependencies":["package_info_plus"],"dev_dependency":false}],"web":[{"name":"package_info_plus","path":"/home/likun/.pub-cache/hosted/pub.dev/package_info_plus-10.0.0/","dependencies":[],"dev_dependency":false},{"name":"shared_preferences_web","path":"/home/likun/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3/","dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/home/likun/.pub-cache/hosted/pub.dev/wakelock_plus-1.6.0/","dependencies":["package_info_plus"],"dev_dependency":false}]},"dependencyGraph":[{"name":"jni","dependencies":[]},{"name":"jni_flutter","dependencies":["jni"]},{"name":"media_kit_libs_android_video","dependencies":[]},{"name":"media_kit_libs_ios_video","dependencies":[]},{"name":"media_kit_libs_linux","dependencies":[]},{"name":"media_kit_libs_macos_video","dependencies":[]},{"name":"media_kit_libs_windows_video","dependencies":[]},{"name":"media_kit_video","dependencies":["wakelock_plus","screen_brightness_android","volume_controller"]},{"name":"package_info_plus","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":["jni","jni_flutter"]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"screen_brightness_android","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_foundation","shared_preferences_linux","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_foundation","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]},{"name":"sqflite","dependencies":["sqflite_android","sqflite_darwin"]},{"name":"sqflite_android","dependencies":[]},{"name":"sqflite_darwin","dependencies":[]},{"name":"volume_controller","dependencies":[]},{"name":"wakelock_plus","dependencies":["package_info_plus"]},{"name":"webview_cookie_manager_plus","dependencies":[]},{"name":"webview_flutter","dependencies":["webview_flutter_android","webview_flutter_wkwebview"]},{"name":"webview_flutter_android","dependencies":[]},{"name":"webview_flutter_wkwebview","dependencies":[]}],"date_created":"2026-04-22 18:47:23.452695","version":"3.41.7","swift_package_manager_enabled":{"ios":false,"macos":false}} \ No newline at end of file +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"media_kit_libs_ios_video","path":"/home/jules/.pub-cache/hosted/pub.dev/media_kit_libs_ios_video-1.1.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_video","path":"/home/jules/.pub-cache/hosted/pub.dev/media_kit_video-1.3.1/","native_build":true,"dependencies":["wakelock_plus","volume_controller"],"dev_dependency":false},{"name":"package_info_plus","path":"/home/jules/.pub-cache/hosted/pub.dev/package_info_plus-10.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/home/jules/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/home/jules/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"sqflite_darwin","path":"/home/jules/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"volume_controller","path":"/home/jules/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/home/jules/.pub-cache/hosted/pub.dev/wakelock_plus-1.6.0/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false},{"name":"webview_cookie_manager_plus","path":"/home/jules/.pub-cache/hosted/pub.dev/webview_cookie_manager_plus-2.0.17/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"webview_flutter_wkwebview","path":"/home/jules/.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.24.5/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false}],"android":[{"name":"jni","path":"/home/jules/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni_flutter","path":"/home/jules/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/","native_build":true,"dependencies":["jni"],"dev_dependency":false},{"name":"media_kit_libs_android_video","path":"/home/jules/.pub-cache/hosted/pub.dev/media_kit_libs_android_video-1.3.8/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_video","path":"/home/jules/.pub-cache/hosted/pub.dev/media_kit_video-1.3.1/","native_build":true,"dependencies":["wakelock_plus","screen_brightness_android","volume_controller"],"dev_dependency":false},{"name":"package_info_plus","path":"/home/jules/.pub-cache/hosted/pub.dev/package_info_plus-10.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_android","path":"/home/jules/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/","native_build":false,"dependencies":["jni","jni_flutter"],"dev_dependency":false},{"name":"screen_brightness_android","path":"/home/jules/.pub-cache/hosted/pub.dev/screen_brightness_android-2.1.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_android","path":"/home/jules/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.23/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"sqflite_android","path":"/home/jules/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"volume_controller","path":"/home/jules/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/home/jules/.pub-cache/hosted/pub.dev/wakelock_plus-1.6.0/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false},{"name":"webview_cookie_manager_plus","path":"/home/jules/.pub-cache/hosted/pub.dev/webview_cookie_manager_plus-2.0.17/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"webview_flutter_android","path":"/home/jules/.pub-cache/hosted/pub.dev/webview_flutter_android-4.11.0/","native_build":true,"dependencies":[],"dev_dependency":false}],"macos":[{"name":"media_kit_libs_macos_video","path":"/home/jules/.pub-cache/hosted/pub.dev/media_kit_libs_macos_video-1.1.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_video","path":"/home/jules/.pub-cache/hosted/pub.dev/media_kit_video-1.3.1/","native_build":true,"dependencies":["wakelock_plus","volume_controller"],"dev_dependency":false},{"name":"package_info_plus","path":"/home/jules/.pub-cache/hosted/pub.dev/package_info_plus-10.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/home/jules/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_foundation","path":"/home/jules/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"sqflite_darwin","path":"/home/jules/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false},{"name":"volume_controller","path":"/home/jules/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/home/jules/.pub-cache/hosted/pub.dev/wakelock_plus-1.6.0/","native_build":true,"dependencies":["package_info_plus"],"dev_dependency":false},{"name":"webview_flutter_wkwebview","path":"/home/jules/.pub-cache/hosted/pub.dev/webview_flutter_wkwebview-3.24.5/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false}],"linux":[{"name":"jni","path":"/home/jules/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_libs_linux","path":"/home/jules/.pub-cache/hosted/pub.dev/media_kit_libs_linux-1.2.1/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_video","path":"/home/jules/.pub-cache/hosted/pub.dev/media_kit_video-1.3.1/","native_build":true,"dependencies":["wakelock_plus","volume_controller"],"dev_dependency":false},{"name":"package_info_plus","path":"/home/jules/.pub-cache/hosted/pub.dev/package_info_plus-10.0.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"path_provider_linux","path":"/home/jules/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_linux","path":"/home/jules/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1/","native_build":false,"dependencies":["path_provider_linux"],"dev_dependency":false},{"name":"volume_controller","path":"/home/jules/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/home/jules/.pub-cache/hosted/pub.dev/wakelock_plus-1.6.0/","native_build":false,"dependencies":["package_info_plus"],"dev_dependency":false}],"windows":[{"name":"jni","path":"/home/jules/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_libs_windows_video","path":"/home/jules/.pub-cache/hosted/pub.dev/media_kit_libs_windows_video-1.0.11/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"media_kit_video","path":"/home/jules/.pub-cache/hosted/pub.dev/media_kit_video-1.3.1/","native_build":true,"dependencies":["wakelock_plus","volume_controller"],"dev_dependency":false},{"name":"package_info_plus","path":"/home/jules/.pub-cache/hosted/pub.dev/package_info_plus-10.0.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"path_provider_windows","path":"/home/jules/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"shared_preferences_windows","path":"/home/jules/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1/","native_build":false,"dependencies":["path_provider_windows"],"dev_dependency":false},{"name":"volume_controller","path":"/home/jules/.pub-cache/hosted/pub.dev/volume_controller-3.4.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/home/jules/.pub-cache/hosted/pub.dev/wakelock_plus-1.6.0/","native_build":false,"dependencies":["package_info_plus"],"dev_dependency":false}],"web":[{"name":"package_info_plus","path":"/home/jules/.pub-cache/hosted/pub.dev/package_info_plus-10.0.0/","dependencies":[],"dev_dependency":false},{"name":"shared_preferences_web","path":"/home/jules/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3/","dependencies":[],"dev_dependency":false},{"name":"wakelock_plus","path":"/home/jules/.pub-cache/hosted/pub.dev/wakelock_plus-1.6.0/","dependencies":["package_info_plus"],"dev_dependency":false}]},"dependencyGraph":[{"name":"jni","dependencies":[]},{"name":"jni_flutter","dependencies":["jni"]},{"name":"media_kit_libs_android_video","dependencies":[]},{"name":"media_kit_libs_ios_video","dependencies":[]},{"name":"media_kit_libs_linux","dependencies":[]},{"name":"media_kit_libs_macos_video","dependencies":[]},{"name":"media_kit_libs_windows_video","dependencies":[]},{"name":"media_kit_video","dependencies":["wakelock_plus","screen_brightness_android","volume_controller"]},{"name":"package_info_plus","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":["jni","jni_flutter"]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"screen_brightness_android","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_foundation","shared_preferences_linux","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_foundation","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]},{"name":"sqflite","dependencies":["sqflite_android","sqflite_darwin"]},{"name":"sqflite_android","dependencies":[]},{"name":"sqflite_darwin","dependencies":[]},{"name":"volume_controller","dependencies":[]},{"name":"wakelock_plus","dependencies":["package_info_plus"]},{"name":"webview_cookie_manager_plus","dependencies":[]},{"name":"webview_flutter","dependencies":["webview_flutter_android","webview_flutter_wkwebview"]},{"name":"webview_flutter_android","dependencies":[]},{"name":"webview_flutter_wkwebview","dependencies":[]}],"date_created":"2026-04-23 19:22:54.223829","version":"3.41.2","swift_package_manager_enabled":{"ios":false,"macos":false}} \ No newline at end of file diff --git a/lib/core/client/twitter_client.dart b/lib/core/client/twitter_client.dart index ffd56bd..b8abf1c 100644 --- a/lib/core/client/twitter_client.dart +++ b/lib/core/client/twitter_client.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:math'; import 'package:collection/collection.dart'; import 'twitter_account.dart'; import '../models/tweet.dart'; @@ -17,10 +18,14 @@ class TweetResponse { } class TwitterClient { - static const String graphqlSearchTimelineUriPath = '/graphql/nK1dw4oV3k4w5TdtcAdSww/SearchTimeline'; - static const String graphqlFollowingUriPath = '/graphql/FEcMGoVOUjm0aU9BJrrGZA/Following'; - static const String graphqlUserByScreenNameUriPath = '/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName'; - static const String graphqlUserTweetsUriPath = '/graphql/rIIwMe1ObkGh_ByBtTCtRQ/UserTweets'; + static const String graphqlSearchTimelineUriPath = + '/graphql/nK1dw4oV3k4w5TdtcAdSww/SearchTimeline'; + static const String graphqlFollowingUriPath = + '/graphql/FEcMGoVOUjm0aU9BJrrGZA/Following'; + static const String graphqlUserByScreenNameUriPath = + '/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName'; + static const String graphqlUserTweetsUriPath = + '/graphql/rIIwMe1ObkGh_ByBtTCtRQ/UserTweets'; static const Map defaultFeatures = { 'android_ad_formats_media_component_render_overlay_enabled': false, @@ -93,9 +98,11 @@ class TwitterClient { 'super_follow_tweet_api_enabled': false, 'super_follow_user_api_enabled': false, 'tweet_awards_web_tipping_enabled': false, - 'tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled': true, + 'tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled': + true, 'tweetypie_unmention_optimization_enabled': false, - 'unified_cards_ad_metadata_container_dynamic_card_content_query_enabled': false, + 'unified_cards_ad_metadata_container_dynamic_card_content_query_enabled': + false, 'unified_cards_destination_url_params_enabled': false, 'verified_phone_label_enabled': false, 'vibe_api_enabled': false, @@ -107,8 +114,9 @@ class TwitterClient { Future fetchProfile(String screenName) async { if (screenName.startsWith('@')) screenName = screenName.substring(1); - - final uri = Uri.https('x.com', '/i/api/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName', { + + final uri = Uri.https( + 'x.com', '/i/api/graphql/oUZZZ8Oddwxs8Cd3iW3UEA/UserByScreenName', { 'variables': jsonEncode({ 'screen_name': screenName, 'withHighlightedLabel': true, @@ -142,7 +150,8 @@ class TwitterClient { } } - Future fetchUserTweets(String screenName, {String? cursor, FeedSort? sort, Set? filters}) async { + Future fetchUserTweets(String screenName, + {String? cursor, FeedSort? sort, Set? filters}) async { return fetchTrendingMedia( query: "from:$screenName", cursor: cursor, @@ -151,7 +160,8 @@ class TwitterClient { ); } - Future> fetchFollowing(String userId, {int maxCount = 1000}) async { + Future> fetchFollowing(String userId, + {int maxCount = 1000}) async { final allSubs = []; String? currentCursor; @@ -167,24 +177,32 @@ class TwitterClient { variables["cursor"] = currentCursor; } - final uri = Uri.https('x.com', '/i/api/graphql/FEcMGoVOUjm0aU9BJrrGZA/Following', { + final uri = Uri.https( + 'x.com', '/i/api/graphql/FEcMGoVOUjm0aU9BJrrGZA/Following', { 'variables': jsonEncode(variables), 'features': jsonEncode(followingFeatures), }); - AppLogger.log('Fetching following with cursor: $currentCursor (Found so far: ${allSubs.length})'); - final response = await TwitterAccount.fetch(uri, cacheDuration: const Duration(hours: 1)); + AppLogger.log( + 'Fetching following with cursor: $currentCursor (Found so far: ${allSubs.length})'); + final response = await TwitterAccount.fetch(uri, + cacheDuration: const Duration(hours: 1)); if (response.statusCode != 200) { - AppLogger.log('fetchFollowing Error: ${response.statusCode} ${response.body}'); + AppLogger.log( + 'fetchFollowing Error: ${response.statusCode} ${response.body}'); break; } final data = json.decode(response.body); - final instructions = List.from(data['data']?['user']?['result']?['timeline']?['timeline']?['instructions'] ?? []); - + final instructions = List.from(data['data']?['user']?['result'] + ?['timeline']?['timeline']?['instructions'] ?? + []); + if (instructions.isEmpty) break; - final addEntries = instructions.firstWhereOrNull((e) => e['type'] == 'TimelineAddEntries' || e['__typename'] == 'TimelineAddEntries'); + final addEntries = instructions.firstWhereOrNull((e) => + e['type'] == 'TimelineAddEntries' || + e['__typename'] == 'TimelineAddEntries'); if (addEntries == null) break; final entries = List.from(addEntries['entries'] ?? []); @@ -195,27 +213,34 @@ class TwitterClient { for (final entry in entries) { final entryId = entry['entryId'] as String? ?? ''; - if (entryId.startsWith('cursor-bottom-') || entryId.startsWith('sq-cursor-bottom-')) { + if (entryId.startsWith('cursor-bottom-') || + entryId.startsWith('sq-cursor-bottom-')) { nextCursor = entry['content']?['value']; continue; } - final userResult = entry["content"]?["itemContent"]?["user_results"]?["result"]; + final userResult = + entry["content"]?["itemContent"]?["user_results"]?["result"]; if (userResult == null) continue; - - final legacy = userResult["core"]?["screen_name"] != null ? userResult["core"] : userResult["legacy"]; + + final legacy = userResult["core"]?["screen_name"] != null + ? userResult["core"] + : userResult["legacy"]; if (legacy == null) continue; allSubs.add(Subscription( id: userResult["rest_id"], screenName: legacy["screen_name"], name: legacy["name"] ?? '', - profileImageUrl: userResult["avatar"]?["image_url"] ?? legacy["profile_image_url_https"], + profileImageUrl: userResult["avatar"]?["image_url"] ?? + legacy["profile_image_url_https"], )); newFound++; } - if (newFound == 0 || nextCursor == null || nextCursor == currentCursor) { + if (newFound == 0 || + nextCursor == null || + nextCursor == currentCursor) { break; } currentCursor = nextCursor; @@ -227,9 +252,13 @@ class TwitterClient { } } - Future fetchTrendingMedia({String? cursor, String? query, FeedSort? sort, Set? filters}) async { + Future fetchTrendingMedia( + {String? cursor, + String? query, + FeedSort? sort, + Set? filters}) async { String finalQuery = query ?? ""; - + if (filters != null && filters.isNotEmpty) { final filterQueries = []; for (final f in filters) { @@ -246,7 +275,8 @@ class TwitterClient { } } final combinedFilter = "(${filterQueries.join(' OR ')})"; - finalQuery = finalQuery.isEmpty ? combinedFilter : "$finalQuery $combinedFilter"; + finalQuery = + finalQuery.isEmpty ? combinedFilter : "$finalQuery $combinedFilter"; } else if (query == null) { // Default "All" case: empty query means no extra filters finalQuery = ""; @@ -274,19 +304,23 @@ class TwitterClient { }); try { - AppLogger.log('Fetching media with query: $finalQuery and cursor: $cursor, sort: $sort'); - final response = await TwitterAccount.fetch(uri).timeout(const Duration(seconds: 15)); + AppLogger.log( + 'Fetching media with query: $finalQuery and cursor: $cursor, sort: $sort'); + final response = + await TwitterAccount.fetch(uri).timeout(const Duration(seconds: 15)); if (response.statusCode != 200) { - AppLogger.log('Error status: ${response.statusCode} body: ${response.body}'); + AppLogger.log( + 'Error status: ${response.statusCode} body: ${response.body}'); return TweetResponse(tweets: []); } final result = json.decode(response.body); - final timeline = result?['data']?['search_by_raw_query']?['search_timeline']; + final timeline = + result?['data']?['search_by_raw_query']?['search_timeline']; if (timeline == null) return TweetResponse(tweets: []); final tweetResponse = _parseTweets(timeline); - + if (sort == FeedSort.random) { tweetResponse.tweets.shuffle(); } else if (sort == FeedSort.oldest) { @@ -300,9 +334,10 @@ class TwitterClient { } } - Future fetchSubscribedMedia({String? cursor, FeedSort? sort, Set? filters}) async { + Future fetchSubscribedMedia( + {String? cursor, FeedSort? sort, Set? filters}) async { var subs = await Repository.getSubscriptions(); - + if (subs.isEmpty) { final currentAccount = TwitterAccount.currentAccount; if (currentAccount != null && currentAccount.restId.isNotEmpty) { @@ -317,18 +352,34 @@ class TwitterClient { return fetchTrendingMedia(cursor: cursor, sort: sort, filters: filters); } - final pickedSubs = (subs.toList()..shuffle()).take(20); + final random = Random(); + final pickedSubs = []; + if (subs.length <= 20) { + pickedSubs.addAll(subs); + pickedSubs.shuffle(random); + } else { + final seenIndices = {}; + while (pickedSubs.length < 20) { + final index = random.nextInt(subs.length); + if (seenIndices.add(index)) { + pickedSubs.add(subs[index]); + } + } + } + final users = pickedSubs.map((s) => 'from:${s.screenName}').join(' OR '); String query = "include:nativeretweets ($users) -filter:replies"; - + if (sort == FeedSort.popular) { query += " min_faves:50"; } - final response = await fetchTrendingMedia(cursor: cursor, query: query, sort: sort, filters: filters); - + final response = await fetchTrendingMedia( + cursor: cursor, query: query, sort: sort, filters: filters); + if (cursor == null && response.tweets.length < 5) { - final trendingResponse = await fetchTrendingMedia(sort: sort, filters: filters); + final trendingResponse = + await fetchTrendingMedia(sort: sort, filters: filters); final combined = [...response.tweets]; final seenIds = response.tweets.map((t) => t.id).toSet(); for (final t in trendingResponse.tweets) { @@ -340,11 +391,12 @@ class TwitterClient { cursorBottom: response.cursorBottom, ); } - + return response; } - Future fetchUserTimeline(String userId, {String? cursor}) async { + Future fetchUserTimeline(String userId, + {String? cursor}) async { final variables = { "userId": userId, "count": 20, @@ -367,7 +419,8 @@ class TwitterClient { if (response.statusCode != 200) return TweetResponse(tweets: []); final data = json.decode(response.body); - final timeline = data['data']?['user']?['result']?['timeline_v2']?['timeline']; + final timeline = + data['data']?['user']?['result']?['timeline_v2']?['timeline']; if (timeline == null) return TweetResponse(tweets: []); return _parseTweets(timeline); @@ -377,7 +430,8 @@ class TwitterClient { } } - Future fetchUserTimelineByScreenName(String screenName, {String? cursor}) async { + Future fetchUserTimelineByScreenName(String screenName, + {String? cursor}) async { return fetchTrendingMedia( query: "from:$screenName", cursor: cursor, @@ -387,12 +441,17 @@ class TwitterClient { TweetResponse _parseTweets(Map timeline) { final tweets = []; - final instructions = List.from(timeline['instructions'] ?? timeline['timeline']?['instructions'] ?? []); - - final addEntries = instructions.firstWhereOrNull((e) => e['type'] == 'TimelineAddEntries' || e['__typename'] == 'TimelineAddEntries'); + final instructions = List.from(timeline['instructions'] ?? + timeline['timeline']?['instructions'] ?? + []); + + final addEntries = instructions.firstWhereOrNull((e) => + e['type'] == 'TimelineAddEntries' || + e['__typename'] == 'TimelineAddEntries'); if (addEntries == null) { // Try to find instructions in a different place - AppLogger.log('No TimelineAddEntries found in instructions: ${instructions.map((e) => e['type'] ?? e['__typename'])}'); + AppLogger.log( + 'No TimelineAddEntries found in instructions: ${instructions.map((e) => e['type'] ?? e['__typename'])}'); return TweetResponse(tweets: []); } @@ -402,11 +461,15 @@ class TwitterClient { for (final entry in entries) { final entryId = entry['entryId'] as String? ?? ''; - - if (entryId.startsWith('cursor-top-') || entryId.startsWith('sq-cursor-top-')) { - cursorTop = entry['content']?['value'] ?? entry['content']?['cursorType']; - } else if (entryId.startsWith('cursor-bottom-') || entryId.startsWith('sq-cursor-bottom-')) { - cursorBottom = entry['content']?['value'] ?? entry['content']?['cursorType']; + + if (entryId.startsWith('cursor-top-') || + entryId.startsWith('sq-cursor-top-')) { + cursorTop = + entry['content']?['value'] ?? entry['content']?['cursorType']; + } else if (entryId.startsWith('cursor-bottom-') || + entryId.startsWith('sq-cursor-bottom-')) { + cursorBottom = + entry['content']?['value'] ?? entry['content']?['cursorType']; } try { @@ -431,7 +494,7 @@ class TwitterClient { AppLogger.log('Error parsing entry $entryId: $e'); } } - + return TweetResponse( tweets: tweets, cursorTop: cursorTop, @@ -439,9 +502,12 @@ class TwitterClient { ); } - void parseTweetResult(Map itemContent, String entryId, List tweets) { + void parseTweetResult( + Map itemContent, String entryId, List tweets) { try { - var tweetResult = itemContent['itemContent']?['tweet_results']?['result'] ?? itemContent['tweet_results']?['result']; + var tweetResult = itemContent['itemContent']?['tweet_results'] + ?['result'] ?? + itemContent['tweet_results']?['result']; if (tweetResult == null) return; if (tweetResult['__typename'] == 'TweetWithVisibilityResults') { @@ -456,17 +522,23 @@ class TwitterClient { var legacy = tweetResult['legacy']; if (legacy == null) return; - var retweetedStatusResult = tweetResult['retweeted_status_result'] ?? legacy['retweeted_status_result'] ?? legacy['repostedStatusResults']; - if (retweetedStatusResult != null && retweetedStatusResult['result'] != null) { + var retweetedStatusResult = tweetResult['retweeted_status_result'] ?? + legacy['retweeted_status_result'] ?? + legacy['repostedStatusResults']; + if (retweetedStatusResult != null && + retweetedStatusResult['result'] != null) { var retweetedResult = retweetedStatusResult['result']; - if (retweetedResult['rest_id'] == null && retweetedResult['tweet'] != null) { + if (retweetedResult['rest_id'] == null && + retweetedResult['tweet'] != null) { retweetedResult = retweetedResult['tweet']; } if (retweetedResult['legacy'] != null) { legacy = retweetedResult['legacy']; - var retweetedCore = retweetedResult['core'] ?? retweetedResult['tweet']?['core']; + var retweetedCore = + retweetedResult['core'] ?? retweetedResult['tweet']?['core']; var retweetedUserResults = retweetedCore?['user_results']?['result']; - var retweetedScreenName = retweetedUserResults?['legacy']?['screen_name']; + var retweetedScreenName = + retweetedUserResults?['legacy']?['screen_name']; if (retweetedScreenName != null) { tweetResult['core'] = retweetedCore; } @@ -479,15 +551,20 @@ class TwitterClient { final userAvatarUrl = userResults?['legacy']?['profile_image_url_https']; final media = List.from(legacy['entities']?['media'] ?? []); - final extendedMedia = List.from(legacy['extended_entities']?['media'] ?? []); + final extendedMedia = + List.from(legacy['extended_entities']?['media'] ?? []); final allMedia = extendedMedia.isNotEmpty ? extendedMedia : media; if (allMedia.isEmpty) { - var noteTweetResult = tweetResult['note_tweet']?['note_tweet_results']?['result']; + var noteTweetResult = + tweetResult['note_tweet']?['note_tweet_results']?['result']; if (noteTweetResult != null) { - final noteMedia = List.from(noteTweetResult['entity_set']?['media'] ?? []); - final noteExtendedMedia = List.from(noteTweetResult['extended_entities']?['media'] ?? []); - allMedia.addAll(noteExtendedMedia.isNotEmpty ? noteExtendedMedia : noteMedia); + final noteMedia = + List.from(noteTweetResult['entity_set']?['media'] ?? []); + final noteExtendedMedia = + List.from(noteTweetResult['extended_entities']?['media'] ?? []); + allMedia.addAll( + noteExtendedMedia.isNotEmpty ? noteExtendedMedia : noteMedia); } } @@ -506,10 +583,11 @@ class TwitterClient { if (variants.isEmpty) continue; var bestVariant = variants - .where((v) => v['content_type'] == 'video/mp4' && v['url'] != null) + .where( + (v) => v['content_type'] == 'video/mp4' && v['url'] != null) .toList() ..sort((a, b) => (b['bitrate'] ?? 0).compareTo(a['bitrate'] ?? 0)); - + if (bestVariant.isNotEmpty) { mediaUrls.add(bestVariant.first['url']); } else if (variants.first['url'] != null) { @@ -532,16 +610,20 @@ class TwitterClient { createdAt = DateTime.fromMillisecondsSinceEpoch(ms, isUtc: true); } } catch (e) { - AppLogger.log('XFLOW: Error parsing date_ms ${legacy['created_at_ms']}: $e'); + AppLogger.log( + 'XFLOW: Error parsing date_ms ${legacy['created_at_ms']}: $e'); } } if (createdAt == null) { - AppLogger.log('XFLOW: No date found in legacy: ${legacy.keys.toList()}'); + AppLogger.log( + 'XFLOW: No date found in legacy: ${legacy.keys.toList()}'); } tweets.add(Tweet( - id: tweetResult['rest_id'] ?? tweetResult['tweet']?['rest_id'] ?? entryId, + id: tweetResult['rest_id'] ?? + tweetResult['tweet']?['rest_id'] ?? + entryId, text: legacy['full_text'] ?? legacy['text'] ?? '', userHandle: '@$screenName', userAvatarUrl: userAvatarUrl, diff --git a/pubspec.lock b/pubspec.lock index 5fd989a..a20f4a1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -444,10 +444,10 @@ packages: dependency: transitive description: name: matcher - sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" url: "https://pub.dev" source: hosted - version: "0.12.19" + version: "0.12.18" material_color_utilities: dependency: transitive description: @@ -961,10 +961,10 @@ packages: dependency: transitive description: name: test_api - sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a" + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" url: "https://pub.dev" source: hosted - version: "0.7.10" + version: "0.7.9" typed_data: dependency: transitive description: diff --git a/test/widget_test.dart b/test/widget_test.dart deleted file mode 100644 index c9672c7..0000000 --- a/test/widget_test.dart +++ /dev/null @@ -1,30 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:xflow/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -}