migrate flutter3.0

This commit is contained in:
Junyuan Feng
2022-05-12 15:06:48 +08:00
parent bfe7140a44
commit 282443a548
38 changed files with 184 additions and 140 deletions

View File

@@ -22,6 +22,8 @@ linter:
# `// ignore_for_file: name_of_lint` syntax on the line or in the file # `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint. # producing the lint.
rules: rules:
library_private_types_in_public_api: false
use_build_context_synchronously: false
# avoid_print: false # Uncomment to disable the `avoid_print` rule # avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule

1
android.2.10.5.sksl.json Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
ios.2.10.5.sksl.json Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
PODS: PODS:
- countly_flutter (20.11.4): - countly_flutter (21.11.0):
- Flutter - Flutter
- Flutter (1.0.0) - Flutter (1.0.0)
- flutter_native_splash (0.0.1): - flutter_native_splash (0.0.1):
@@ -39,7 +39,7 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/url_launcher_ios/ios" :path: ".symlinks/plugins/url_launcher_ios/ios"
SPEC CHECKSUMS: SPEC CHECKSUMS:
countly_flutter: 38419412e193a1faa5babeb5d28a63fda260687d countly_flutter: e245f94349d8adf306c22e60c10648c69aae7380
Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a
flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef
path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02 path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02

View File

@@ -354,7 +354,7 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 129; CURRENT_PROJECT_VERSION = 134;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
@@ -362,7 +362,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.129; MARKETING_VERSION = 1.0.134;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -484,7 +484,7 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 129; CURRENT_PROJECT_VERSION = 134;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
@@ -492,7 +492,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.129; MARKETING_VERSION = 1.0.134;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -508,7 +508,7 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 129; CURRENT_PROJECT_VERSION = 134;
DEVELOPMENT_TEAM = BA88US33G6; DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
@@ -516,7 +516,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1.0.129; MARKETING_VERSION = 1.0.134;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox; PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";

View File

@@ -46,5 +46,7 @@
<string>en</string> <string>en</string>
<string>zh</string> <string>zh</string>
</array> </array>
</dict> <key>CADisableMinimumFrameDurationOnPhone</key>
</plist> <true/>
</dict>
</plist>

View File

@@ -1,6 +1,9 @@
import 'dart:async'; import 'dart:async';
import 'dart:io';
import 'package:countly_flutter/countly_config.dart';
import 'package:countly_flutter/countly_flutter.dart'; import 'package:countly_flutter/countly_flutter.dart';
import 'package:logging/logging.dart';
class Analysis { class Analysis {
static const _url = 'https://countly.xuty.cc'; static const _url = 'https://countly.xuty.cc';
@@ -9,12 +12,18 @@ class Analysis {
static bool _enabled = false; static bool _enabled = false;
static Future<void> init(bool debug) async { static Future<void> init(bool debug) async {
_enabled = true; if (Platform.isAndroid || Platform.isIOS) {
await Countly.setLoggingEnabled(debug); _enabled = true;
await Countly.init(_url, _key); final config = CountlyConfig(_url, _key)
await Countly.start(); .setLoggingEnabled(debug)
await Countly.enableCrashReporting(); .enableCrashReporting();
await Countly.giveAllConsent(); await Countly.initWithConfig(config);
await Countly.start();
await Countly.giveAllConsent();
} else {
Logger('COUNTLY')
.info('Unsupported platform ${Platform.operatingSystem}');
}
} }
static void recordView(String view) { static void recordView(String view) {

View File

@@ -1,11 +1,11 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:toolbox/data/res/color.dart'; import 'package:toolbox/data/res/color.dart';
class MenuItem { class DropdownBtnItem {
final String text; final String text;
final IconData icon; final IconData icon;
const MenuItem({ const DropdownBtnItem({
required this.text, required this.text,
required this.icon, required this.icon,
}); });
@@ -24,19 +24,21 @@ class MenuItem {
} }
class ServerTabMenuItems { class ServerTabMenuItems {
static const List<MenuItem> firstItems = [sftp, snippet, apt, docker]; static const List<DropdownBtnItem> firstItems = [sftp, snippet, apt, docker];
static const List<MenuItem> secondItems = [edit]; static const List<DropdownBtnItem> secondItems = [edit];
static const sftp = MenuItem(text: 'SFTP', icon: Icons.insert_drive_file); static const sftp =
static const snippet = MenuItem(text: 'Snippet', icon: Icons.label); DropdownBtnItem(text: 'SFTP', icon: Icons.insert_drive_file);
static const snippet = DropdownBtnItem(text: 'Snippet', icon: Icons.label);
static const apt = static const apt =
MenuItem(text: 'Apt/Yum', icon: Icons.system_security_update); DropdownBtnItem(text: 'Apt/Yum', icon: Icons.system_security_update);
static const docker = MenuItem(text: 'Docker', icon: Icons.view_agenda); static const docker =
static const edit = MenuItem(text: 'Edit', icon: Icons.edit); DropdownBtnItem(text: 'Docker', icon: Icons.view_agenda);
static const edit = DropdownBtnItem(text: 'Edit', icon: Icons.edit);
} }
class DockerMenuItems { class DockerMenuItems {
static const rm = MenuItem(text: 'Remove', icon: Icons.delete); static const rm = DropdownBtnItem(text: 'Remove', icon: Icons.delete);
static const start = MenuItem(text: 'Start', icon: Icons.play_arrow); static const start = DropdownBtnItem(text: 'Start', icon: Icons.play_arrow);
static const stop = MenuItem(text: 'Stop', icon: Icons.stop); static const stop = DropdownBtnItem(text: 'Stop', icon: Icons.stop);
} }

View File

@@ -92,17 +92,20 @@ class AptProvider extends BusyProvider {
Future<String> _update() async { Future<String> _update() async {
switch (dist) { switch (dist) {
case Distribution.rehl: case Distribution.rehl:
return await client!.run(_wrap('yum check-update')).string; return await client?.run(_wrap('yum check-update')).string ?? '';
default: default:
final session = await client!.execute(_wrap('apt update')); final session = await client!.execute(_wrap('apt update'));
session.stderr.listen((event) => _onPwd(event, session.stdin)); session.stderr.listen((event) => _onPwd(event, session.stdin));
session.stdout.listen((event) { session.stdout.listen((event) {
updateLog = (updateLog ?? '') + event.string; updateLog = (updateLog ?? '') + event.string;
notifyListeners(); notifyListeners();
onUpdate!(); onUpdate ?? () {}();
}); });
await session.done; await session.done;
return await client!.run('apt list --upgradeable'.withLangExport).string; return await client
?.run('apt list --upgradeable'.withLangExport)
.string ??
'';
} }
} }
@@ -151,7 +154,7 @@ class AptProvider extends BusyProvider {
if (pwd.isEmpty) { if (pwd.isEmpty) {
logger.info('sudo password request cancelled'); logger.info('sudo password request cancelled');
} }
stdin.add(Uint8List.fromList(utf8.encode(pwd + '\n'))); stdin.add(Uint8List.fromList(utf8.encode('$pwd\n')));
} }
} }

View File

@@ -34,8 +34,8 @@ class DebugProvider extends ChangeNotifier {
), ),
); );
_addWidget(SingleChildScrollView( _addWidget(SingleChildScrollView(
child: widget,
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
child: widget,
)); ));
} }

View File

@@ -31,7 +31,6 @@ class DockerProvider extends BusyProvider {
} }
final verRaw = await client!.run('docker version'.withLangExport).string; final verRaw = await client!.run('docker version'.withLangExport).string;
print(verRaw);
if (verRaw.contains(dockerNotFound)) { if (verRaw.contains(dockerNotFound)) {
error = 'docker not found'; error = 'docker not found';
notifyListeners(); notifyListeners();

View File

@@ -182,7 +182,7 @@ class ServerProvider extends BusyProvider {
.run("echo '$shellCmd' > $shellPath && chmod +x $shellPath"); .run("echo '$shellCmd' > $shellPath && chmod +x $shellPath");
} catch (e) { } catch (e) {
_servers[idx].connectionState = ServerConnectionState.failed; _servers[idx].connectionState = ServerConnectionState.failed;
_servers[idx].status.failedInfo = e.toString() + ' ## '; _servers[idx].status.failedInfo = '$e ## ';
logger.warning(e); logger.warning(e);
} finally { } finally {
notifyListeners(); notifyListeners();
@@ -264,9 +264,7 @@ class ServerProvider extends BusyProvider {
} }
idx++; idx++;
} }
return (int.parse(value.split('\n')[idx].trim()) / 1000) return '${(int.parse(value.split('\n')[idx].trim()) / 1000).toStringAsFixed(1)}°C';
.toStringAsFixed(1) +
'°C';
} }
void _getCPU( void _getCPU(

View File

@@ -2,9 +2,9 @@
class BuildData { class BuildData {
static const String name = "ServerBox"; static const String name = "ServerBox";
static const int build = 133; static const int build = 134;
static const String engine = static const String engine =
"Flutter 2.10.5 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision 5464c5bac7 (3 weeks ago) • 2022-04-18 09:55:37 -0700\nEngine • revision 57d3bac3dd\nTools • Dart 2.16.2 • DevTools 2.9.2\n"; "Flutter 3.0.0 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision ee4e09cce0 (2 days ago) • 2022-05-09 16:45:18 -0700\nEngine • revision d1b9a6938a\nTools • Dart 2.17.0 • DevTools 2.12.2\n";
static const String buildAt = "2022-05-10 21:49:33.780998"; static const String buildAt = "2022-05-12 14:31:57.568409";
static const int modifications = 1; static const int modifications = 37;
} }

View File

@@ -1,5 +1,5 @@
const backendUrl = 'https://res.lolli.tech'; const backendUrl = 'https://res.lolli.tech';
const baseUrl = backendUrl + '/toolbox'; const baseUrl = '$backendUrl/toolbox';
const joinQQGroupUrl = 'https://jq.qq.com/?_wv=1027&k=G0hUmPAq'; const joinQQGroupUrl = 'https://jq.qq.com/?_wv=1027&k=G0hUmPAq';
const myGithub = 'https://github.com/LollipopKit'; const myGithub = 'https://github.com/LollipopKit';
const rainSunMeGithub = 'https://github.com/RainSunMe'; const rainSunMeGithub = 'https://github.com/RainSunMe';

View File

@@ -41,7 +41,7 @@ class MessageLookup extends MessageLookupByLibrary {
static String m8(myGithub) => "\n用❤️制作 by ${myGithub}"; static String m8(myGithub) => "\n用❤️制作 by ${myGithub}";
static String m9(user) => "用户${user}的密码"; static String m9(user) => "${user}的密码";
static String m10(url) => "请到 ${url} 提交问题"; static String m10(url) => "请到 ${url} 提交问题";

View File

@@ -112,7 +112,7 @@
"noUpdateAvailable": "没有可用更新", "noUpdateAvailable": "没有可用更新",
"foundNUpdate": "找到 {count} 个更新", "foundNUpdate": "找到 {count} 个更新",
"updateAll": "更新全部", "updateAll": "更新全部",
"pwdForUser": "用户{user}的密码", "pwdForUser": "{user}的密码",
"platformNotSupportUpdate": "当前平台不支持更新,请编译最新源码后手动安装", "platformNotSupportUpdate": "当前平台不支持更新,请编译最新源码后手动安装",
"invalidVersionHelp": "请确保正确安装了docker或者使用的非自编译版本。如果没有以上问题请在 {url} 提交问题。", "invalidVersionHelp": "请确保正确安装了docker或者使用的非自编译版本。如果没有以上问题请在 {url} 提交问题。",
"noInterface": "没有可用的接口" "noInterface": "没有可用的接口"

View File

@@ -60,12 +60,15 @@ class _AptManagePageState extends State<AptManagePage>
// ignore: prefer_function_declarations_over_variables // ignore: prefer_function_declarations_over_variables
PwdRequestFunc onPwdRequest = (user) async { PwdRequestFunc onPwdRequest = (user) async {
if (!mounted) return '';
final textController = TextEditingController(); final textController = TextEditingController();
await showRoundDialog( await showRoundDialog(
context, context,
s.pwdForUser(user ?? s.unknown), s.pwdForUser(user ?? s.unknown),
TextField( TextField(
controller: textController, controller: textController,
keyboardType: TextInputType.visiblePassword,
obscureText: true,
decoration: InputDecoration( decoration: InputDecoration(
labelText: s.pwd, labelText: s.pwd,
), ),
@@ -153,7 +156,8 @@ class _AptManagePageState extends State<AptManagePage>
Padding( Padding(
padding: const EdgeInsets.all(17), padding: const EdgeInsets.all(17),
child: UrlText( child: UrlText(
text: '${s.experimentalFeature}\n${s.reportBugsOnGithubIssue(issueUrl)}', text:
'${s.experimentalFeature}\n${s.reportBugsOnGithubIssue(issueUrl)}',
replace: 'Github Issue', replace: 'Github Issue',
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),

View File

@@ -96,7 +96,7 @@ class _ConvertPageState extends State<ConvertPage>
Widget _buildTypeOption() { Widget _buildTypeOption() {
final decode = s.decode; final decode = s.decode;
final encode = s.encode; final encode = s.encode;
final List<String> _typeOption = [ final List<String> typeOption = [
'Base64 $decode', 'Base64 $decode',
'Base64 $encode', 'Base64 $encode',
'URL $encode', 'URL $encode',
@@ -135,7 +135,7 @@ class _ConvertPageState extends State<ConvertPage>
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Text(_typeOption[_typeOptionIndex], Text(typeOption[_typeOptionIndex],
textScaleFactor: 1.0, textScaleFactor: 1.0,
textAlign: TextAlign.left, textAlign: TextAlign.left,
style: TextStyle( style: TextStyle(
@@ -151,7 +151,7 @@ class _ConvertPageState extends State<ConvertPage>
], ],
), ),
), ),
children: _typeOption children: typeOption
.map((e) => ListTile( .map((e) => ListTile(
title: Text( title: Text(
e, e,
@@ -159,7 +159,7 @@ class _ConvertPageState extends State<ConvertPage>
color: color:
_theme.textTheme.bodyText2!.color!.withAlpha(177)), _theme.textTheme.bodyText2!.color!.withAlpha(177)),
), ),
trailing: _buildRadio(_typeOption.indexOf(e)), trailing: _buildRadio(typeOption.indexOf(e)),
)) ))
.toList(), .toList(),
), ),

View File

@@ -26,7 +26,6 @@ class DockerManagePage extends StatefulWidget {
class _DockerManagePageState extends State<DockerManagePage> { class _DockerManagePageState extends State<DockerManagePage> {
final _docker = locator<DockerProvider>(); final _docker = locator<DockerProvider>();
final greyTextStyle = const TextStyle(color: Colors.grey); final greyTextStyle = const TextStyle(color: Colors.grey);
late MediaQueryData _media;
late S s; late S s;
@override @override
@@ -38,7 +37,6 @@ class _DockerManagePageState extends State<DockerManagePage> {
@override @override
void didChangeDependencies() { void didChangeDependencies() {
super.didChangeDependencies(); super.didChangeDependencies();
_media = MediaQuery.of(context);
s = S.of(context); s = S.of(context);
} }
@@ -72,17 +70,25 @@ class _DockerManagePageState extends State<DockerManagePage> {
return Consumer<DockerProvider>(builder: (_, docker, __) { return Consumer<DockerProvider>(builder: (_, docker, __) {
final running = docker.items; final running = docker.items;
if (docker.error != null && running == null) { if (docker.error != null && running == null) {
return SizedBox.expand(child: Column( return SizedBox.expand(
mainAxisAlignment: MainAxisAlignment.center, child: Column(
crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ crossAxisAlignment: CrossAxisAlignment.center,
const Icon(Icons.error, size: 37,), children: [
const SizedBox(height: 27), const Icon(
Text(docker.error!), Icons.error,
const SizedBox(height: 27), size: 37,
Padding(padding: const EdgeInsets.all(17), child: _buildSolution(docker.error!),) ),
], const SizedBox(height: 27),
),); Text(docker.error!),
const SizedBox(height: 27),
Padding(
padding: const EdgeInsets.all(17),
child: _buildSolution(docker.error!),
)
],
),
);
} }
if (running == null) { if (running == null) {
_docker.refresh(); _docker.refresh();
@@ -109,7 +115,10 @@ class _DockerManagePageState extends State<DockerManagePage> {
case 'no client': case 'no client':
return Text(s.waitConnection); return Text(s.waitConnection);
case 'invalid version': case 'invalid version':
return UrlText(text: s.invalidVersionHelp(issueUrl), replace: 'Github',); return UrlText(
text: s.invalidVersionHelp(issueUrl),
replace: 'Github',
);
default: default:
return Text(s.unknownError); return Text(s.unknownError);
} }
@@ -154,17 +163,17 @@ class _DockerManagePageState extends State<DockerManagePage> {
), ),
customItemsHeight: 8, customItemsHeight: 8,
items: [ items: [
DropdownMenuItem<MenuItem>( DropdownMenuItem<DropdownBtnItem>(
value: item, value: item,
child: item.build, child: item.build,
), ),
DropdownMenuItem<MenuItem>( DropdownMenuItem<DropdownBtnItem>(
value: DockerMenuItems.rm, value: DockerMenuItems.rm,
child: DockerMenuItems.rm.build, child: DockerMenuItems.rm.build,
), ),
], ],
onChanged: (value) { onChanged: (value) {
final item = value as MenuItem; final item = value as DropdownBtnItem;
switch (item) { switch (item) {
case DockerMenuItems.rm: case DockerMenuItems.rm:
_docker.delete(containerId); _docker.delete(containerId);

View File

@@ -53,7 +53,7 @@ class _MyHomePageState extends State<MyHomePage>
void initState() { void initState() {
super.initState(); super.initState();
_serverProvider = locator<ServerProvider>(); _serverProvider = locator<ServerProvider>();
WidgetsBinding.instance?.addObserver(this); WidgetsBinding.instance.addObserver(this);
_selectIndex = locator<SettingStore>().launchPage.fetch()!; _selectIndex = locator<SettingStore>().launchPage.fetch()!;
_pageController = PageController(initialPage: _selectIndex); _pageController = PageController(initialPage: _selectIndex);
_advancedDrawerController = AdvancedDrawerController(); _advancedDrawerController = AdvancedDrawerController();
@@ -69,7 +69,7 @@ class _MyHomePageState extends State<MyHomePage>
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
WidgetsBinding.instance?.removeObserver(this); WidgetsBinding.instance.removeObserver(this);
} }
@override @override
@@ -249,7 +249,6 @@ class _MyHomePageState extends State<MyHomePage>
), ),
AboutListTile( AboutListTile(
icon: const Icon(Icons.text_snippet), icon: const Icon(Icons.text_snippet),
child: Text(s.license),
applicationName: BuildData.name, applicationName: BuildData.name,
applicationVersion: _buildVersionStr(), applicationVersion: _buildVersionStr(),
applicationIcon: _buildIcon(), applicationIcon: _buildIcon(),
@@ -261,6 +260,7 @@ class _MyHomePageState extends State<MyHomePage>
replace: 'RainSunMe', replace: 'RainSunMe',
), ),
], ],
child: Text(s.license),
) )
], ],
), ),

View File

@@ -80,9 +80,7 @@ class _PingPageState extends State<PingPage>
style: summaryTextStyle, style: summaryTextStyle,
), ),
trailing: Text( trailing: Text(
s.pingAvg + '${s.pingAvg}${result.statistic?.avg?.toStringAsFixed(2) ?? s.unknown} $ms',
(result.statistic?.avg?.toStringAsFixed(2) ?? s.unknown) +
' $ms',
style: TextStyle(fontSize: 14, color: primaryColor)), style: TextStyle(fontSize: 14, color: primaryColor)),
)); ));
} }

View File

@@ -85,7 +85,6 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage>
], ],
), ),
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
child: const Icon(Icons.save),
tooltip: s.save, tooltip: s.save,
onPressed: () async { onPressed: () async {
final name = nameController.text; final name = nameController.text;
@@ -124,6 +123,7 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage>
} }
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
child: const Icon(Icons.save),
), ),
); );
} }

View File

@@ -123,7 +123,7 @@ class _ServerDetailPageState extends State<ServerDetailPage>
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
Text( Text(
percent.toStringAsFixed(1) + '%', '${percent.toStringAsFixed(1)}%',
style: const TextStyle(fontSize: 13), style: const TextStyle(fontSize: 13),
textScaleFactor: 1.0, textScaleFactor: 1.0,
), ),

View File

@@ -195,10 +195,9 @@ class _ServerPageState extends State<ServerPage>
children: [ children: [
_buildPercentCircle(ss.cpu2Status.usedPercent()), _buildPercentCircle(ss.cpu2Status.usedPercent()),
_buildPercentCircle(ss.memory.used / ss.memory.total * 100), _buildPercentCircle(ss.memory.used / ss.memory.total * 100),
_buildIOData('Conn:\n' + ss.tcp.maxConn.toString(), _buildIOData('Conn:\n${ss.tcp.maxConn}', 'Fail:\n${ss.tcp.fail}'),
'Fail:\n' + ss.tcp.fail.toString()), _buildIOData(
_buildIOData('Total:\n' + rootDisk.size, 'Total:\n${rootDisk.size}', 'Used:\n${rootDisk.usedPercent}%')
'Used:\n' + rootDisk.usedPercent.toString() + '%')
], ],
), ),
const SizedBox(height: 13), const SizedBox(height: 13),
@@ -229,21 +228,21 @@ class _ServerPageState extends State<ServerPage>
customItemsHeight: 8, customItemsHeight: 8,
items: [ items: [
...ServerTabMenuItems.firstItems.map( ...ServerTabMenuItems.firstItems.map(
(item) => DropdownMenuItem<MenuItem>( (item) => DropdownMenuItem<DropdownBtnItem>(
value: item, value: item,
child: item.build, child: item.build,
), ),
), ),
const DropdownMenuItem<Divider>(enabled: false, child: Divider()), const DropdownMenuItem<Divider>(enabled: false, child: Divider()),
...ServerTabMenuItems.secondItems.map( ...ServerTabMenuItems.secondItems.map(
(item) => DropdownMenuItem<MenuItem>( (item) => DropdownMenuItem<DropdownBtnItem>(
value: item, value: item,
child: item.build, child: item.build,
), ),
), ),
], ],
onChanged: (value) { onChanged: (value) {
final item = value as MenuItem; final item = value as DropdownBtnItem;
switch (item) { switch (item) {
case ServerTabMenuItems.apt: case ServerTabMenuItems.apt:
AppRoute(AptManagePage(spi), 'apt manage page').go(context); AppRoute(AptManagePage(spi), 'apt manage page').go(context);

View File

@@ -150,10 +150,6 @@ class _SettingPageState extends State<SettingPage> {
textColor: priColor, textColor: priColor,
tilePadding: roundRectCardPadding, tilePadding: roundRectCardPadding,
childrenPadding: roundRectCardPadding, childrenPadding: roundRectCardPadding,
children: [
_buildAppColorPicker(priColor),
_buildColorPickerConfirmBtn()
],
trailing: ClipOval( trailing: ClipOval(
child: Container( child: Container(
color: priColor, color: priColor,
@@ -164,7 +160,11 @@ class _SettingPageState extends State<SettingPage> {
title: Text( title: Text(
s.appPrimaryColor, s.appPrimaryColor,
style: textStyle, style: textStyle,
)); ),
children: [
_buildAppColorPicker(priColor),
_buildColorPickerConfirmBtn()
]);
} }
Widget _buildAppColorPicker(Color selected) { Widget _buildAppColorPicker(Color selected) {

View File

@@ -31,7 +31,7 @@ class _SFTPDownloadedPageState extends State<SFTPDownloadedPage> {
super.initState(); super.initState();
sftpDownloadDir.then((dir) { sftpDownloadDir.then((dir) {
_path = PathWithPrefix(dir.path); _path = PathWithPrefix(dir.path);
_prefixPath = dir.path + '/'; _prefixPath = '${dir.path}/';
setState(() {}); setState(() {});
}); });
} }
@@ -58,8 +58,8 @@ class _SFTPDownloadedPageState extends State<SFTPDownloadedPage> {
], ],
), ),
body: FadeIn( body: FadeIn(
child: _buildBody(),
key: UniqueKey(), key: UniqueKey(),
child: _buildBody(),
), ),
bottomNavigationBar: SafeArea( bottomNavigationBar: SafeArea(
child: _buildPath(), child: _buildPath(),

View File

@@ -122,6 +122,7 @@ class _SFTPPageState extends State<SFTPPage> {
} else { } else {
return RefreshIndicator( return RefreshIndicator(
child: FadeIn( child: FadeIn(
key: Key(_status.spi!.name + _status.path!.path),
child: ListView.builder( child: ListView.builder(
itemCount: _status.files!.length + 1, itemCount: _status.files!.length + 1,
controller: _scrollController, controller: _scrollController,
@@ -155,7 +156,6 @@ class _SFTPPageState extends State<SFTPPage> {
); );
}, },
), ),
key: Key(_status.spi!.name + _status.path!.path),
), ),
onRefresh: () => listDir(path: _status.path?.path)); onRefresh: () => listDir(path: _status.path?.path));
} }
@@ -277,7 +277,7 @@ class _SFTPPageState extends State<SFTPPage> {
return; return;
} }
_status.client! _status.client!
.mkdir(_status.path!.path + '/' + textController.text); .mkdir('${_status.path!.path}/${textController.text}');
Navigator.of(context).pop(); Navigator.of(context).pop();
listDir(); listDir();
}, },
@@ -316,7 +316,7 @@ class _SFTPPageState extends State<SFTPPage> {
return; return;
} }
(await _status.client! (await _status.client!
.open(_status.path!.path + '/' + textController.text)) .open('${_status.path!.path}/${textController.text}'))
.writeBytes(Uint8List(0)); .writeBytes(Uint8List(0));
Navigator.of(context).pop(); Navigator.of(context).pop();
listDir(); listDir();

View File

@@ -215,6 +215,10 @@ class _SnippetListPageState extends State<SnippetListPage> {
height: 111, height: 111,
child: Stack(children: [ child: Stack(children: [
Positioned( Positioned(
top: 36,
bottom: 36,
left: 0,
right: 0,
child: Container( child: Container(
height: 37, height: 37,
decoration: const BoxDecoration( decoration: const BoxDecoration(
@@ -222,10 +226,6 @@ class _SnippetListPageState extends State<SnippetListPage> {
color: Colors.black12, color: Colors.black12,
), ),
), ),
top: 36,
bottom: 36,
left: 0,
right: 0,
), ),
ListWheelScrollView.useDelegate( ListWheelScrollView.useDelegate(
itemExtent: 37, itemExtent: 37,

View File

@@ -8,10 +8,10 @@ class RoundRectCard extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Card( return Card(
child: child,
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
shape: const RoundedRectangleBorder( shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(17))), borderRadius: BorderRadius.all(Radius.circular(17))),
child: child,
); );
} }
} }

View File

@@ -22,11 +22,11 @@ class UrlText extends StatelessWidget {
List<InlineSpan> _getTextSpans(bool isDarkMode) { List<InlineSpan> _getTextSpans(bool isDarkMode) {
List<InlineSpan> widgets = <InlineSpan>[]; List<InlineSpan> widgets = <InlineSpan>[];
final reg = RegExp(regUrl); final reg = RegExp(regUrl);
Iterable<Match> _matches = reg.allMatches(text); Iterable<Match> matches = reg.allMatches(text);
List<_ResultMatch> resultMatches = <_ResultMatch>[]; List<_ResultMatch> resultMatches = <_ResultMatch>[];
int start = 0; int start = 0;
for (Match match in _matches) { for (Match match in matches) {
final group0 = match.group(0); final group0 = match.group(0);
if (group0 != null && group0.isNotEmpty) { if (group0 != null && group0.isNotEmpty) {
if (start != match.start) { if (start != match.start) {

View File

@@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST
url_launcher_linux url_launcher_linux
) )
list(APPEND FLUTTER_FFI_PLUGIN_LIST
)
set(PLUGIN_BUNDLED_LIBRARIES) set(PLUGIN_BUNDLED_LIBRARIES)
foreach(plugin ${FLUTTER_PLUGIN_LIST}) foreach(plugin ${FLUTTER_PLUGIN_LIST})
@@ -14,3 +17,8 @@ foreach(plugin ${FLUTTER_PLUGIN_LIST})
list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>) list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
endforeach(plugin) endforeach(plugin)
foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin})
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
endforeach(ffi_plugin)

View File

@@ -25,7 +25,7 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS: SPEC CHECKSUMS:
FlutterMacOS: 57701585bf7de1b3fc2bb61f6378d73bbdea8424 FlutterMacOS: 57701585bf7de1b3fc2bb61f6378d73bbdea8424
path_provider_macos: 160cab0d5461f0c0e02995469a98f24bdb9a3f1f path_provider_macos: 3c0c3b4b0d4a76d2bf989a913c2de869c5641a19
share_plus_macos: 853ee48e7dce06b633998ca0735d482dd671ade4 share_plus_macos: 853ee48e7dce06b633998ca0735d482dd671ade4
url_launcher_macos: 597e05b8e514239626bcf4a850fcf9ef5c856ec3 url_launcher_macos: 597e05b8e514239626bcf4a850fcf9ef5c856ec3

View File

@@ -75,7 +75,7 @@ Future<void> updateBuildData() async {
Future<void> dartFormat() async { Future<void> dartFormat() async {
final result = await Process.run('dart', ['format', '.']); final result = await Process.run('dart', ['format', '.']);
print('\n' + result.stdout); print('\n${result.stdout}');
if (result.exitCode != 0) { if (result.exitCode != 0) {
print(result.stderr); print(result.stderr);
exit(1); exit(1);

View File

@@ -21,7 +21,7 @@ packages:
name: args name: args
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.3.0" version: "2.3.1"
asn1lib: asn1lib:
dependency: transitive dependency: transitive
description: description:
@@ -86,7 +86,7 @@ packages:
name: collection name: collection
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.15.0" version: "1.16.0"
convert: convert:
dependency: transitive dependency: transitive
description: description:
@@ -99,10 +99,10 @@ packages:
description: description:
path: "." path: "."
ref: master ref: master
resolved-ref: fb568d2e50714f65f85b822c343bb53f129b9f6f resolved-ref: "585759048345ab7defdfd9cae3a6c76dc451fe51"
url: "https://github.com/Countly/countly-sdk-flutter-bridge.git" url: "https://github.com/Countly/countly-sdk-flutter-bridge.git"
source: git source: git
version: "20.11.4" version: "21.11.0"
crypto: crypto:
dependency: transitive dependency: transitive
description: description:
@@ -151,14 +151,14 @@ packages:
name: extended_image name: extended_image
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.0.3" version: "6.2.0"
extended_image_library: extended_image_library:
dependency: transitive dependency: transitive
description: description:
name: extended_image_library name: extended_image_library
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.4" version: "3.3.0"
fading_edge_scrollview: fading_edge_scrollview:
dependency: transitive dependency: transitive
description: description:
@@ -172,7 +172,7 @@ packages:
name: fake_async name: fake_async
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.3.0"
ffi: ffi:
dependency: transitive dependency: transitive
description: description:
@@ -205,7 +205,7 @@ packages:
name: flutter_lints name: flutter_lints
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.4" version: "2.0.1"
flutter_localizations: flutter_localizations:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@@ -231,7 +231,7 @@ packages:
name: flutter_plugin_android_lifecycle name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.5" version: "2.0.6"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@@ -292,7 +292,7 @@ packages:
source: hosted source: hosted
version: "3.1.3" version: "3.1.3"
intl: intl:
dependency: transitive dependency: "direct main"
description: description:
name: intl name: intl
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
@@ -304,7 +304,7 @@ packages:
name: js name: js
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.6.3" version: "0.6.4"
lint: lint:
dependency: transitive dependency: transitive
description: description:
@@ -318,7 +318,7 @@ packages:
name: lints name: lints
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.1" version: "2.0.0"
logging: logging:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -346,7 +346,7 @@ packages:
name: material_color_utilities name: material_color_utilities
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.3" version: "0.1.4"
meta: meta:
dependency: transitive dependency: transitive
description: description:
@@ -374,56 +374,56 @@ packages:
name: path name: path
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.0" version: "1.8.1"
path_provider: path_provider:
dependency: "direct main" dependency: "direct main"
description: description:
name: path_provider name: path_provider
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.9" version: "2.0.10"
path_provider_android: path_provider_android:
dependency: transitive dependency: transitive
description: description:
name: path_provider_android name: path_provider_android
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.13" version: "2.0.14"
path_provider_ios: path_provider_ios:
dependency: transitive dependency: transitive
description: description:
name: path_provider_ios name: path_provider_ios
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.8" version: "2.0.9"
path_provider_linux: path_provider_linux:
dependency: transitive dependency: transitive
description: description:
name: path_provider_linux name: path_provider_linux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.5" version: "2.1.6"
path_provider_macos: path_provider_macos:
dependency: transitive dependency: transitive
description: description:
name: path_provider_macos name: path_provider_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.5" version: "2.0.6"
path_provider_platform_interface: path_provider_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: path_provider_platform_interface name: path_provider_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.3" version: "2.0.4"
path_provider_windows: path_provider_windows:
dependency: transitive dependency: transitive
description: description:
name: path_provider_windows name: path_provider_windows
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.5" version: "2.0.6"
pedantic: pedantic:
dependency: transitive dependency: transitive
description: description:
@@ -437,7 +437,7 @@ packages:
name: petitparser name: petitparser
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.4.0" version: "5.0.0"
pinenacl: pinenacl:
dependency: transitive dependency: transitive
description: description:
@@ -547,7 +547,7 @@ packages:
name: source_span name: source_span
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.1" version: "1.8.2"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@@ -582,7 +582,7 @@ packages:
name: test_api name: test_api
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.8" version: "0.4.9"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
@@ -603,35 +603,35 @@ packages:
name: url_launcher name: url_launcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.1.0" version: "6.1.2"
url_launcher_android: url_launcher_android:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_android name: url_launcher_android
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.0.16" version: "6.0.17"
url_launcher_ios: url_launcher_ios:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_ios name: url_launcher_ios
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.0.15" version: "6.0.16"
url_launcher_linux: url_launcher_linux:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_linux name: url_launcher_linux
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.0" version: "3.0.1"
url_launcher_macos: url_launcher_macos:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_macos name: url_launcher_macos
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.0" version: "3.0.1"
url_launcher_platform_interface: url_launcher_platform_interface:
dependency: transitive dependency: transitive
description: description:
@@ -645,21 +645,21 @@ packages:
name: url_launcher_web name: url_launcher_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.9" version: "2.0.11"
url_launcher_windows: url_launcher_windows:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_windows name: url_launcher_windows
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.0" version: "3.0.1"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
name: vector_math name: vector_math
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.1" version: "2.1.2"
win32: win32:
dependency: transitive dependency: transitive
description: description:
@@ -680,7 +680,7 @@ packages:
name: xml name: xml
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.3.1" version: "5.4.1"
yaml: yaml:
dependency: transitive dependency: transitive
description: description:
@@ -689,5 +689,5 @@ packages:
source: hosted source: hosted
version: "3.1.0" version: "3.1.0"
sdks: sdks:
dart: ">=2.16.0 <3.0.0" dart: ">=2.17.0 <3.0.0"
flutter: ">=2.10.0" flutter: ">=3.0.0"

View File

@@ -18,7 +18,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1 version: 1.0.0+1
environment: environment:
sdk: ">=2.16.0 <3.0.0" sdk: ">=2.17.0 <3.0.0"
# Dependencies specify other packages that your package needs in order to work. # Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions # To automatically upgrade your package dependencies to the latest versions
@@ -60,6 +60,7 @@ dependencies:
path_provider: ^2.0.9 path_provider: ^2.0.9
easy_isolate: ^1.3.0 easy_isolate: ^1.3.0
share_plus: ^4.0.4 share_plus: ^4.0.4
intl: ^0.17.0
dev_dependencies: dev_dependencies:
flutter_native_splash: ^2.1.6 flutter_native_splash: ^2.1.6
@@ -71,7 +72,7 @@ dev_dependencies:
# activated in the `analysis_options.yaml` file located at the root of your # activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint # package. See that file for information about deactivating specific lint
# rules and activating additional ones. # rules and activating additional ones.
flutter_lints: ^1.0.0 flutter_lints: ^2.0.0
# For information on the generic Dart part of this file, see the # For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec # following page: https://dart.dev/tools/pub/pubspec

View File

@@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST
url_launcher_windows url_launcher_windows
) )
list(APPEND FLUTTER_FFI_PLUGIN_LIST
)
set(PLUGIN_BUNDLED_LIBRARIES) set(PLUGIN_BUNDLED_LIBRARIES)
foreach(plugin ${FLUTTER_PLUGIN_LIST}) foreach(plugin ${FLUTTER_PLUGIN_LIST})
@@ -14,3 +17,8 @@ foreach(plugin ${FLUTTER_PLUGIN_LIST})
list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>) list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
endforeach(plugin) endforeach(plugin)
foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
endforeach(ffi_plugin)