From aa7d0838b803927d3be6359ee6daaa4046a483fb Mon Sep 17 00:00:00 2001 From: DASHU <385321165@qq.com> Date: Sun, 15 Dec 2024 09:36:46 +0800 Subject: [PATCH] fix windows can't open website bug --- lib/provider/web_provider.dart | 11 +- lib/router/index/index_router.dart | 10 +- .../index/index_web_bottom_component.dart | 124 +++++++++++++++++- lib/router/index/index_web_component.dart | 109 +-------------- 4 files changed, 139 insertions(+), 115 deletions(-) diff --git a/lib/provider/web_provider.dart b/lib/provider/web_provider.dart index 4865371..60f549e 100644 --- a/lib/provider/web_provider.dart +++ b/lib/provider/web_provider.dart @@ -40,7 +40,7 @@ class WebProvider extends ChangeNotifier { return StringUtil.rndNameStr(10); } - void updateWebInfo(WebInfo webInfo) { + void updateWebInfo(WebInfo webInfo, {bool updateUI = true}) { for (var i = 0; i < webInfos.length; i++) { var owi = webInfos[i]; if (owi.id == webInfo.id) { @@ -49,7 +49,9 @@ class WebProvider extends ChangeNotifier { } } - notifyListeners(); + if (updateUI) { + notifyListeners(); + } } WebInfo? currentWebInfo() { @@ -238,7 +240,7 @@ class WebProvider extends ChangeNotifier { Map indexWebviews = {}; - List getIndexWebviews(BuildContext context, Function showControl) { + List getIndexWebviews(BuildContext context) { List list = []; for (var webInfo in webInfos) { if (StringUtil.isBlank(webInfo.url)) { @@ -246,8 +248,7 @@ class WebProvider extends ChangeNotifier { } else { var indexWebComp = indexWebviews[webInfo.id]; if (indexWebComp == null) { - indexWebComp = - IndexWebComponent(webInfo, showControl, key: GlobalKey()); + indexWebComp = IndexWebComponent(webInfo, key: GlobalKey()); indexWebviews[webInfo.id] = indexWebComp; } diff --git a/lib/router/index/index_router.dart b/lib/router/index/index_router.dart index 3883395..57c197c 100644 --- a/lib/router/index/index_router.dart +++ b/lib/router/index/index_router.dart @@ -9,6 +9,7 @@ import 'package:nowser/component/image_component.dart'; import 'package:nowser/component/webview/web_home_component.dart'; import 'package:nowser/main.dart'; import 'package:nowser/provider/web_provider.dart'; +import 'package:nowser/router/index/index_web_bottom_component.dart'; import 'package:nowser/router/index/index_web_component.dart'; import 'package:nowser/util/router_util.dart'; import 'package:provider/provider.dart'; @@ -100,7 +101,7 @@ class _IndexRouter extends CustState var main = IndexedStack( index: _webProvider.index, - children: _webProvider.getIndexWebviews(context, showControl), + children: _webProvider.getIndexWebviews(context), ); return PopScope( @@ -125,7 +126,12 @@ class _IndexRouter extends CustState statusBarIconBrightness: Brightness.dark, statusBarBrightness: Brightness.light, ), - child: main, + child: Column( + children: [ + Expanded(child: main), + IndexWebBottomComponent(showControl), + ], + ), ), ), ); diff --git a/lib/router/index/index_web_bottom_component.dart b/lib/router/index/index_web_bottom_component.dart index 409b53d..8066c24 100644 --- a/lib/router/index/index_web_bottom_component.dart +++ b/lib/router/index/index_web_bottom_component.dart @@ -1,6 +1,20 @@ import 'package:flutter/material.dart'; +import 'package:nostr_sdk/utils/string_util.dart'; +import 'package:nowser/component/webview/web_info.dart'; +import 'package:nowser/provider/web_provider.dart'; +import 'package:provider/provider.dart'; + +import '../../component/webview/webview_number_component.dart'; +import '../../const/base.dart'; +import '../../const/router_path.dart'; +import '../../main.dart'; +import '../../util/router_util.dart'; class IndexWebBottomComponent extends StatefulWidget { + Function showControl; + + IndexWebBottomComponent(this.showControl); + @override State createState() { return _IndexWebBottomComponent(); @@ -10,6 +24,114 @@ class IndexWebBottomComponent extends StatefulWidget { class _IndexWebBottomComponent extends State { @override Widget build(BuildContext context) { - return Container(); + var mediaQuery = MediaQuery.of(context); + var padding = mediaQuery.padding; + var maxWidth = mediaQuery.size.width; + var titleWidth = maxWidth / 2; + + return Selector(builder: (context, webInfo, child) { + if (webInfo == null || StringUtil.isBlank(webInfo.url)) { + return Container(); + } + + String title = ""; + if (StringUtil.isNotBlank(webInfo.title)) { + title = webInfo.title!; + } else if (StringUtil.isNotBlank(webInfo.url)) { + title = webInfo.url; + } + Widget numberWidget = WebViewNumberComponent(); + + return Container( + height: 60, + child: Row( + children: [ + wrapBottomBtn(const Icon(Icons.home_filled), left: 13, right: 8, + onTap: () { + webProvider.goHome(webInfo); + }), + wrapBottomBtn(numberWidget, left: 8, right: 8, onTap: () { + RouterUtil.router(context, RouterPath.WEB_TABS); + }), + Expanded( + child: Hero( + tag: "urlInput", + child: Material( + child: GestureDetector( + onTap: () async { + if (webInfo.controller == null) { + return; + } + + var url = await webInfo.controller!.getUrl(); + var urlStr = url.toString(); + if (StringUtil.isBlank(urlStr) || urlStr == "null") { + urlStr = webInfo.url; + } + var value = await RouterUtil.router( + context, RouterPath.WEB_URL_INPUT, urlStr); + if (value != null && value is String) { + webProvider.goTo(webInfo, value); + } + }, + behavior: HitTestBehavior.translucent, + child: Container( + margin: const EdgeInsets.only( + left: 8, + right: 8, + ), + decoration: BoxDecoration( + border: Border.all(), + borderRadius: + BorderRadius.circular(Base.BASE_PADDING_HALF), + ), + padding: const EdgeInsets.only( + left: Base.BASE_PADDING, + right: Base.BASE_PADDING, + top: Base.BASE_PADDING_HALF, + bottom: Base.BASE_PADDING_HALF, + ), + width: titleWidth, + child: Text( + title, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + ), + ), + ), + ), + wrapBottomBtn(const Icon(Icons.space_dashboard), onTap: () { + widget.showControl(); + }, left: 8, right: 8), + wrapBottomBtn(const Icon(Icons.segment), left: 8, right: 13, + onTap: () { + RouterUtil.router(context, RouterPath.ME); + }), + ], + ), + ); + }, selector: (context, provider) { + return provider.currentWebInfo(); + }); + } + + Widget wrapBottomBtn(Widget btn, + {double left = 10, double right = 10, Function? onTap}) { + return GestureDetector( + onTap: () { + if (onTap != null) { + onTap(); + } + }, + child: Container( + padding: EdgeInsets.only( + left: left, + right: right, + ), + child: btn, + ), + ); } } diff --git a/lib/router/index/index_web_component.dart b/lib/router/index/index_web_component.dart index 9b8a392..6861697 100644 --- a/lib/router/index/index_web_component.dart +++ b/lib/router/index/index_web_component.dart @@ -17,10 +17,7 @@ import 'web_control_component.dart'; class IndexWebComponent extends StatefulWidget { WebInfo webInfo; - Function showControl; - - IndexWebComponent(this.webInfo, this.showControl, {required GlobalKey key}) - : super(key: key); + IndexWebComponent(this.webInfo, {required GlobalKey key}) : super(key: key); @override State createState() { @@ -50,7 +47,6 @@ class _IndexWebComponent extends State { var maxWidth = mediaQuery.size.width; var titleWidth = maxWidth / 2; - Widget numberWidget = WebViewNumberComponent(); var webInfo = widget.webInfo; if (StringUtil.isBlank(webInfo.url)) { @@ -69,88 +65,7 @@ class _IndexWebComponent extends State { webProvider.onLoadStop(webInfo); }); - String title = ""; - if (StringUtil.isNotBlank(webInfo.title)) { - title = webInfo.title!; - } else if (StringUtil.isNotBlank(webInfo.url)) { - title = webInfo.url; - } - - var main = Column( - children: [ - Expanded(child: webComp), - Container( - height: 60, - child: Row( - children: [ - wrapBottomBtn(const Icon(Icons.home_filled), left: 13, right: 8, - onTap: () { - webProvider.goHome(webInfo); - }), - wrapBottomBtn(numberWidget, left: 8, right: 8, onTap: () { - RouterUtil.router(context, RouterPath.WEB_TABS); - }), - Expanded( - child: Hero( - tag: "urlInput", - child: Material( - child: GestureDetector( - onTap: () async { - if (webInfo.controller == null) { - return; - } - - var url = await webInfo.controller!.getUrl(); - var urlStr = url.toString(); - if (StringUtil.isBlank(urlStr) || urlStr == "null") { - urlStr = webInfo.url; - } - var value = await RouterUtil.router( - context, RouterPath.WEB_URL_INPUT, urlStr); - if (value != null && value is String) { - webProvider.goTo(webInfo, value); - } - }, - behavior: HitTestBehavior.translucent, - child: Container( - margin: const EdgeInsets.only( - left: 8, - right: 8, - ), - decoration: BoxDecoration( - border: Border.all(), - borderRadius: - BorderRadius.circular(Base.BASE_PADDING_HALF), - ), - padding: const EdgeInsets.only( - left: Base.BASE_PADDING, - right: Base.BASE_PADDING, - top: Base.BASE_PADDING_HALF, - bottom: Base.BASE_PADDING_HALF, - ), - width: titleWidth, - child: Text( - title, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), - ), - ), - ), - ), - wrapBottomBtn(const Icon(Icons.space_dashboard), onTap: () { - widget.showControl(); - }, left: 8, right: 8), - wrapBottomBtn(const Icon(Icons.segment), left: 8, right: 13, - onTap: () { - RouterUtil.router(context, RouterPath.ME); - }), - ], - ), - ), - ], - ); + var main = webComp; return Container( padding: EdgeInsets.only( @@ -166,25 +81,5 @@ class _IndexWebComponent extends State { webInfo.controller = controller; webInfo.title = title; webProvider.updateWebInfo(webInfo); - // TODO this setState will make windows's webview alway refresh ! - setState(() {}); - } - - Widget wrapBottomBtn(Widget btn, - {double left = 10, double right = 10, Function? onTap}) { - return GestureDetector( - onTap: () { - if (onTap != null) { - onTap(); - } - }, - child: Container( - padding: EdgeInsets.only( - left: left, - right: right, - ), - child: btn, - ), - ); } }