From e7931fc10009e07debcca3223b29115e78527856 Mon Sep 17 00:00:00 2001 From: wanghongenpin Date: Tue, 29 Oct 2024 21:31:10 +0800 Subject: [PATCH] fix json text view --- lib/ui/component/json/json_text.dart | 64 ++++++++++--------- linux/flutter/generated_plugin_registrant.cc | 8 +-- linux/flutter/generated_plugins.cmake | 2 +- macos/Flutter/GeneratedPluginRegistrant.swift | 4 +- .../flutter/generated_plugin_registrant.cc | 6 +- windows/flutter/generated_plugins.cmake | 2 +- 6 files changed, 44 insertions(+), 42 deletions(-) diff --git a/lib/ui/component/json/json_text.dart b/lib/ui/component/json/json_text.dart index 22a696d..180aa91 100644 --- a/lib/ui/component/json/json_text.dart +++ b/lib/ui/component/json/json_text.dart @@ -13,12 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import 'dart:io'; +import 'dart:math'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:proxypin/ui/component/json/theme.dart'; -import 'package:proxypin/ui/component/utils.dart'; -class JsonText extends StatefulWidget { +class JsonText extends StatelessWidget { final ColorTheme colorTheme; final dynamic json; final String indent; @@ -26,37 +28,11 @@ class JsonText extends StatefulWidget { const JsonText({super.key, required this.json, this.indent = ' ', required this.colorTheme, this.scrollController}); - @override - State createState() => _JsonTextSate(); -} - -class _JsonTextSate extends State { - late ColorTheme colorTheme; - late dynamic json; - late String indent; - late ScrollController? scrollController; - - @override - void initState() { - super.initState(); - colorTheme = widget.colorTheme; - json = widget.json; - indent = widget.indent; - scrollController = trackingScroll(widget.scrollController); - } - - @override - void dispose() { - scrollController?.dispose(); - super.dispose(); - } - @override Widget build(BuildContext context) { var jsnParser = JsnParser(json, colorTheme, indent); - var future = jsnParser.getLength() < 30 - ? Future.value(jsnParser.getJsonTree()) - : compute((message) => message.getJsonTree(), jsnParser).catchError((error) => [Text(error.toString())]); + var future = + compute((message) => message.getJsonTree(), jsnParser).catchError((error) => [Text(error.toString())]); return FutureBuilder( future: future, @@ -73,7 +49,7 @@ class _JsonTextSate extends State { height: MediaQuery.of(context).size.height - 160, child: ListView.builder( physics: const BouncingScrollPhysics(), - controller: scrollController, + controller: trackingScroll(), cacheExtent: 1000, itemBuilder: (context, index) => textList[index], itemCount: textList.length)); @@ -84,6 +60,32 @@ class _JsonTextSate extends State { return Container(); }); } + + ///滚动条 + ScrollController trackingScroll() { + var trackingScroll = TrackingScrollController(); + double offset = 0; + trackingScroll.addListener(() { + if (trackingScroll.offset < -10 || (trackingScroll.offset < 30 && trackingScroll.offset < offset)) { + if (scrollController != null && scrollController!.offset >= 0) { + scrollController?.jumpTo(scrollController!.offset - max((offset - trackingScroll.offset), 15)); + } + } + offset = trackingScroll.offset; + }); + + if (Platform.isIOS) { + scrollController?.addListener(() { + if (scrollController!.offset >= scrollController!.position.maxScrollExtent) { + scrollController?.jumpTo(scrollController!.position.maxScrollExtent); + trackingScroll + .jumpTo(trackingScroll.offset + (scrollController!.offset - scrollController!.position.maxScrollExtent)); + } + }); + } + + return trackingScroll; + } } class JsnParser { diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index c6f7be7..3f8c288 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include @@ -31,9 +31,9 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) proxy_manager_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "ProxyManagerPlugin"); proxy_manager_plugin_register_with_registrar(proxy_manager_registrar); - g_autoptr(FlPluginRegistrar) screen_retriever_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin"); - screen_retriever_plugin_register_with_registrar(screen_retriever_registrar); + g_autoptr(FlPluginRegistrar) screen_retriever_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverLinuxPlugin"); + screen_retriever_linux_plugin_register_with_registrar(screen_retriever_linux_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 81c7476..4ed09c7 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -8,7 +8,7 @@ list(APPEND FLUTTER_PLUGIN_LIST flutter_desktop_context_menu flutter_js proxy_manager - screen_retriever + screen_retriever_linux url_launcher_linux window_manager ) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index f27b94a..17cf8cc 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -12,7 +12,7 @@ import flutter_desktop_context_menu import flutter_js import path_provider_foundation import proxy_manager -import screen_retriever +import screen_retriever_macos import share_plus import shared_preferences_foundation import url_launcher_macos @@ -26,7 +26,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FlutterJsPlugin.register(with: registry.registrar(forPlugin: "FlutterJsPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) ProxyManagerPlugin.register(with: registry.registrar(forPlugin: "ProxyManagerPlugin")) - ScreenRetrieverPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverPlugin")) + ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index cb0a6ff..2c58eab 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include @@ -31,8 +31,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); ProxyManagerPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("ProxyManagerPlugin")); - ScreenRetrieverPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("ScreenRetrieverPlugin")); + ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ScreenRetrieverWindowsPluginCApi")); SharePlusWindowsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); UrlLauncherWindowsRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index a4ea3e4..862f263 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -9,7 +9,7 @@ list(APPEND FLUTTER_PLUGIN_LIST flutter_js permission_handler_windows proxy_manager - screen_retriever + screen_retriever_windows share_plus url_launcher_windows win32audio