-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* refactor: implement single instance with window_manager * style: format code * refactor(App): move WebViewDashboard * refactor(App): Home * refactor(Home): bind WindowListener * feat(App): dispose webview when window is hidden * feat(App): show progress indicator when window is reopen * chore: update .gitignore * feat: override applicationSupportsSecureRestorableState * chore: resolve merge conflict * chore: v1.24.1-beat.3 * ci: upgrade flutter
- Loading branch information
Showing
11 changed files
with
228 additions
and
99 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
import 'dart:io'; | ||
|
||
import 'package:flutter/material.dart'; | ||
import 'package:url_launcher/url_launcher.dart'; | ||
import 'package:webview_flutter/webview_flutter.dart'; | ||
import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart'; | ||
import 'package:webview_win_floating/webview_plugin.dart'; | ||
import 'package:window_manager/window_manager.dart'; | ||
import 'package:path/path.dart' as path; | ||
|
||
class WebViewDashboard extends StatefulWidget { | ||
final String baseUrl; | ||
final String urlStr; | ||
final String homeDir; | ||
final ValueChanged<String> onUrlChanged; | ||
|
||
const WebViewDashboard(this.homeDir, this.baseUrl, this.urlStr, this.onUrlChanged, {super.key}); | ||
|
||
@override | ||
State<WebViewDashboard> createState() => _WebViewDashboardState(); | ||
} | ||
|
||
class _WebViewDashboardState extends State<WebViewDashboard> { | ||
late WebViewController? _controller; | ||
|
||
_WebViewDashboardState(); | ||
|
||
@override | ||
void dispose() async { | ||
super.dispose(); | ||
var curUrl = await _controller?.currentUrl(); | ||
if(curUrl!=null){ | ||
widget.onUrlChanged(curUrl); | ||
} | ||
_controller=null; | ||
} | ||
|
||
|
||
@override | ||
void initState() { | ||
super.initState(); | ||
late final PlatformWebViewControllerCreationParams params; | ||
if (WebViewPlatform.instance is WebKitWebViewPlatform) { | ||
params = WebKitWebViewControllerCreationParams(); | ||
} else { | ||
String cacheDir = path.join(widget.homeDir, 'cache_webview'); | ||
params = WindowsPlatformWebViewControllerCreationParams( | ||
userDataFolder: cacheDir); | ||
} | ||
final WebViewController controller = | ||
WebViewController.fromPlatformCreationParams(params); | ||
|
||
controller.setNavigationDelegate( | ||
NavigationDelegate(onNavigationRequest: (NavigationRequest request) { | ||
if (request.url.startsWith(widget.baseUrl)) { | ||
widget.onUrlChanged(request.url); | ||
return NavigationDecision.navigate; | ||
} | ||
launchUrl(Uri.parse(request.url)); | ||
return NavigationDecision.prevent; | ||
}, onPageFinished: (String url) async { | ||
await windowManager.show(); | ||
await windowManager.focus(); | ||
}), | ||
); | ||
|
||
controller.loadRequest(Uri.parse(widget.urlStr)); | ||
_controller = controller; | ||
} | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
if(_controller !=null){ | ||
return Scaffold( | ||
body: WebViewWidget(controller: _controller as WebViewController), | ||
); | ||
} | ||
return Text("Disposed"); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
import 'dart:io'; | ||
|
||
import 'package:flutter/material.dart'; | ||
import 'package:lux/dashboard.dart'; | ||
import 'package:lux/progress_indicator.dart'; | ||
import 'package:window_manager/window_manager.dart'; | ||
|
||
class Home extends StatefulWidget { | ||
final String baseUrl; | ||
final String urlStr; | ||
final String homeDir; | ||
|
||
const Home(this.homeDir, this.baseUrl, this.urlStr, {super.key}); | ||
@override | ||
State<Home> createState() => _HomeState(); | ||
} | ||
|
||
class _HomeState extends State<Home> with WindowListener { | ||
|
||
bool isWebviewHidden = false; | ||
|
||
String? dashboardUrl; | ||
|
||
void onChanged(String newUrl){ | ||
dashboardUrl= newUrl; | ||
} | ||
|
||
void _init() async { | ||
windowManager.addListener(this); | ||
await windowManager.setPreventClose(true); | ||
setState(() {}); | ||
} | ||
|
||
@override | ||
void initState() { | ||
super.initState(); | ||
_init(); | ||
} | ||
|
||
@override | ||
void onWindowClose() async { | ||
setState(() { | ||
isWebviewHidden= true; | ||
}); | ||
if (Platform.isMacOS) { | ||
if (await windowManager.isFullScreen()) { | ||
await windowManager.setFullScreen(false); | ||
//FIXME: remove delay | ||
await Future.delayed(const Duration(seconds: 1)); | ||
await windowManager.minimize(); | ||
} else { | ||
await windowManager.minimize(); | ||
} | ||
} else { | ||
await windowManager.hide(); | ||
} | ||
} | ||
|
||
@override | ||
void onWindowFocus() async { | ||
setState(() { | ||
isWebviewHidden= false; | ||
}); | ||
} | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
var preUrl = dashboardUrl ?? widget.urlStr; | ||
return Scaffold( | ||
body: isWebviewHidden ? AppProgressIndicator() : WebViewDashboard(widget.homeDir, widget.baseUrl,preUrl,onChanged) | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
import 'package:flutter/material.dart'; | ||
|
||
|
||
class AppProgressIndicator extends StatefulWidget { | ||
const AppProgressIndicator({super.key}); | ||
|
||
@override | ||
State<AppProgressIndicator> createState() => | ||
_AppProgressIndicatorState(); | ||
} | ||
|
||
class _AppProgressIndicatorState extends State<AppProgressIndicator> | ||
with TickerProviderStateMixin { | ||
late AnimationController controller; | ||
|
||
@override | ||
void initState() { | ||
controller = AnimationController( | ||
vsync: this, | ||
duration: const Duration(milliseconds: 500), | ||
)..addListener(() { | ||
setState(() {}); | ||
}); | ||
controller.repeat(reverse: false); | ||
super.initState(); | ||
} | ||
|
||
@override | ||
void dispose() { | ||
controller.dispose(); | ||
super.dispose(); | ||
} | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
return Center( | ||
child: CircularProgressIndicator( | ||
value: controller.value, | ||
semanticsLabel: 'Circular progress indicator', | ||
), | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.