diff --git a/flutter/lib/desktop/pages/connection_tab_page.dart b/flutter/lib/desktop/pages/connection_tab_page.dart index 66f342919..be7c76f2a 100644 --- a/flutter/lib/desktop/pages/connection_tab_page.dart +++ b/flutter/lib/desktop/pages/connection_tab_page.dart @@ -30,12 +30,13 @@ class _ConnectionTabPageState extends State { _ConnectionTabPageState(Map params) { if (params['id'] != null) { - tabController.state.value.tabs.add(TabInfo( + tabController.add(TabInfo( key: params['id'], label: params['id'], selectedIcon: selectedIcon, unselectedIcon: unselectedIcon, page: RemotePage( + key: ValueKey(params['id']), id: params['id'], tabBarHeight: _fullscreenID.value.isNotEmpty ? 0 : kDesktopRemoteTabBarHeight, @@ -63,8 +64,8 @@ class _ConnectionTabPageState extends State { label: id, selectedIcon: selectedIcon, unselectedIcon: unselectedIcon, - closable: false, page: RemotePage( + key: ValueKey(id), id: id, tabBarHeight: _fullscreenID.value.isNotEmpty ? 0 diff --git a/flutter/lib/desktop/pages/desktop_tab_page.dart b/flutter/lib/desktop/pages/desktop_tab_page.dart index 2504c699f..4a2fdb7d2 100644 --- a/flutter/lib/desktop/pages/desktop_tab_page.dart +++ b/flutter/lib/desktop/pages/desktop_tab_page.dart @@ -19,13 +19,15 @@ class _DesktopTabPageState extends State { @override void initState() { super.initState(); - tabController.state.value.tabs.add(TabInfo( + tabController.add(TabInfo( key: kTabLabelHomePage, label: kTabLabelHomePage, selectedIcon: Icons.home_sharp, unselectedIcon: Icons.home_outlined, closable: false, - page: DesktopHomePage())); + page: DesktopHomePage( + key: const ValueKey(kTabLabelHomePage), + ))); } @override @@ -59,6 +61,6 @@ class _DesktopTabPageState extends State { label: kTabLabelSettingPage, selectedIcon: Icons.build_sharp, unselectedIcon: Icons.build_outlined, - page: DesktopSettingPage())); + page: DesktopSettingPage(key: const ValueKey(kTabLabelSettingPage)))); } } diff --git a/flutter/lib/desktop/pages/file_manager_tab_page.dart b/flutter/lib/desktop/pages/file_manager_tab_page.dart index 7ae8e36b3..09577128f 100644 --- a/flutter/lib/desktop/pages/file_manager_tab_page.dart +++ b/flutter/lib/desktop/pages/file_manager_tab_page.dart @@ -26,12 +26,12 @@ class _FileManagerTabPageState extends State { static final IconData unselectedIcon = Icons.file_copy_outlined; _FileManagerTabPageState(Map params) { - tabController.state.value.tabs.add(TabInfo( + tabController.add(TabInfo( key: params['id'], label: params['id'], selectedIcon: selectedIcon, unselectedIcon: unselectedIcon, - page: FileManagerPage(id: params['id']))); + page: FileManagerPage(key: ValueKey(params['id']), id: params['id']))); } @override @@ -53,7 +53,7 @@ class _FileManagerTabPageState extends State { label: id, selectedIcon: selectedIcon, unselectedIcon: unselectedIcon, - page: FileManagerPage(id: id))); + page: FileManagerPage(key: ValueKey(id), id: id))); } else if (call.method == "onDestroy") { tabController.state.value.tabs.forEach((tab) { print("executing onDestroy hook, closing ${tab.label}}"); diff --git a/flutter/lib/desktop/widgets/peercard_widget.dart b/flutter/lib/desktop/widgets/peercard_widget.dart index d39f3d359..433ca9284 100644 --- a/flutter/lib/desktop/widgets/peercard_widget.dart +++ b/flutter/lib/desktop/widgets/peercard_widget.dart @@ -35,9 +35,10 @@ class _PeerCard extends StatefulWidget { /// State for the connection page. class _PeerCardState extends State<_PeerCard> with AutomaticKeepAliveClientMixin { - var _menuPos; + var _menuPos = RelativeRect.fill; final double _cardRadis = 20; final double _borderWidth = 2; + final RxBool _iconMoreHover = false.obs; @override Widget build(BuildContext context) { @@ -64,7 +65,7 @@ class _PeerCardState extends State<_PeerCard> : null); }, child: GestureDetector( - onDoubleTapDown: (_) => _connect(peer.id), + onDoubleTap: () => _connect(peer.id), child: Obx(() => peerCardUiType.value == PeerUiType.grid ? _buildPeerCard(context, peer, deco) : _buildPeerTile(context, peer, deco))), @@ -75,7 +76,6 @@ class _PeerCardState extends State<_PeerCard> BuildContext context, Peer peer, Rx deco) { final greyStyle = TextStyle(fontSize: 12, color: MyTheme.color(context).lighterText); - RxBool iconHover = false.obs; return Obx( () => Container( foregroundDecoration: deco.value, @@ -147,30 +147,7 @@ class _PeerCardState extends State<_PeerCard> ], ), ), - InkWell( - child: CircleAvatar( - radius: 12, - backgroundColor: iconHover.value - ? MyTheme.color(context).grayBg! - : MyTheme.color(context).bg!, - child: Icon( - Icons.more_vert, - size: 18, - color: iconHover.value - ? MyTheme.color(context).text - : MyTheme.color(context).lightText, - ), - ), - onTapDown: (e) { - final x = e.globalPosition.dx; - final y = e.globalPosition.dy; - _menuPos = RelativeRect.fromLTRB(x, y, x, y); - }, - onTap: () { - _showPeerMenu(context, peer.id); - }, - onHover: (value) => iconHover.value = value, - ), + _actionMore(peer), ], ).paddingSymmetric(horizontal: 4.0), ), @@ -183,7 +160,6 @@ class _PeerCardState extends State<_PeerCard> Widget _buildPeerCard( BuildContext context, Peer peer, Rx deco) { - RxBool iconHover = false.obs; return Card( color: Colors.transparent, elevation: 0, @@ -272,29 +248,10 @@ class _PeerCardState extends State<_PeerCard> ? Colors.green : Colors.yellow)), Text('${peer.id}') - ]), - InkWell( - child: CircleAvatar( - radius: 12, - backgroundColor: iconHover.value - ? MyTheme.color(context).grayBg! - : MyTheme.color(context).bg!, - child: Icon(Icons.more_vert, - size: 18, - color: iconHover.value - ? MyTheme.color(context).text - : MyTheme.color(context).lightText)), - onTapDown: (e) { - final x = e.globalPosition.dx; - final y = e.globalPosition.dy; - _menuPos = RelativeRect.fromLTRB(x, y, x, y); - }, - onTap: () { - _showPeerMenu(context, peer.id); - }, - onHover: (value) => iconHover.value = value), + ]).paddingSymmetric(vertical: 8), + _actionMore(peer), ], - ).paddingSymmetric(vertical: 8.0, horizontal: 12.0), + ).paddingSymmetric(horizontal: 12.0), ) ], ), @@ -304,6 +261,27 @@ class _PeerCardState extends State<_PeerCard> ); } + Widget _actionMore(Peer peer) => Listener( + onPointerDown: (e) { + final x = e.position.dx; + final y = e.position.dy; + _menuPos = RelativeRect.fromLTRB(x, y, x, y); + }, + onPointerUp: (_) => _showPeerMenu(context, peer.id), + child: MouseRegion( + onEnter: (_) => _iconMoreHover.value = true, + onExit: (_) => _iconMoreHover.value = false, + child: CircleAvatar( + radius: 14, + backgroundColor: _iconMoreHover.value + ? MyTheme.color(context).grayBg! + : MyTheme.color(context).bg!, + child: Icon(Icons.more_vert, + size: 18, + color: _iconMoreHover.value + ? MyTheme.color(context).text + : MyTheme.color(context).lightText)))); + /// Connect to a peer with [id]. /// If [isFileTransfer], starts a session only for file transfer. void _connect(String id, {bool isFileTransfer = false}) async { @@ -325,7 +303,7 @@ class _PeerCardState extends State<_PeerCard> void _showPeerMenu(BuildContext context, String id) async { var value = await showMenu( context: context, - position: this._menuPos, + position: _menuPos, items: await super.widget.popupMenuItemsFunc(), elevation: 8, ); diff --git a/flutter/pubspec.lock b/flutter/pubspec.lock index 0aca2aab1..07862bf38 100644 --- a/flutter/pubspec.lock +++ b/flutter/pubspec.lock @@ -49,7 +49,7 @@ packages: name: async url: "https://pub.flutter-io.cn" source: hosted - version: "2.9.0" + version: "2.8.2" back_button_interceptor: dependency: "direct main" description: @@ -147,7 +147,7 @@ packages: name: characters url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.1" + version: "1.2.0" charcode: dependency: transitive description: @@ -168,7 +168,7 @@ packages: name: clock url: "https://pub.flutter-io.cn" source: hosted - version: "1.1.1" + version: "1.1.0" code_builder: dependency: transitive description: @@ -326,7 +326,7 @@ packages: name: fake_async url: "https://pub.flutter-io.cn" source: hosted - version: "1.3.1" + version: "1.3.0" ffi: dependency: "direct main" description: @@ -423,6 +423,13 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "0.9.3" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.1" flutter_parsed_text: dependency: transitive description: @@ -596,6 +603,13 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "4.6.0" + lints: + dependency: transitive + description: + name: lints + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.0" logging: dependency: transitive description: @@ -609,14 +623,14 @@ packages: name: matcher url: "https://pub.flutter-io.cn" source: hosted - version: "0.12.12" + version: "0.12.11" material_color_utilities: dependency: transitive description: name: material_color_utilities url: "https://pub.flutter-io.cn" source: hosted - version: "0.1.5" + version: "0.1.4" menu_base: dependency: transitive description: @@ -630,7 +644,7 @@ packages: name: meta url: "https://pub.flutter-io.cn" source: hosted - version: "1.8.0" + version: "1.7.0" mime: dependency: transitive description: @@ -707,7 +721,7 @@ packages: name: path url: "https://pub.flutter-io.cn" source: hosted - version: "1.8.2" + version: "1.8.1" path_provider: dependency: "direct main" description: @@ -957,7 +971,7 @@ packages: name: source_span url: "https://pub.flutter-io.cn" source: hosted - version: "1.9.0" + version: "1.8.2" sqflite: dependency: transitive description: @@ -999,7 +1013,7 @@ packages: name: string_scanner url: "https://pub.flutter-io.cn" source: hosted - version: "1.1.1" + version: "1.1.0" synchronized: dependency: transitive description: @@ -1013,14 +1027,14 @@ packages: name: term_glyph url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.1" + version: "1.2.0" test_api: dependency: transitive description: name: test_api url: "https://pub.flutter-io.cn" source: hosted - version: "0.4.12" + version: "0.4.9" timing: dependency: transitive description: diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index 06231f8bf..93c2f64b2 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -83,6 +83,8 @@ dev_dependencies: sdk: flutter build_runner: ^2.1.11 freezed: ^2.0.3 + flutter_lints: ^2.0.0 + # rerun: flutter pub run flutter_launcher_icons:main flutter_icons: android: "ic_launcher"