replace Wrap with builder in PeerView for efficiency

Signed-off-by: 21pages <pages21@163.com>
This commit is contained in:
21pages 2023-09-19 15:01:16 +08:00
parent 0246f050e2
commit 0c6aa381c5
5 changed files with 41 additions and 22 deletions

View File

@ -82,6 +82,7 @@ jobs:
- name: Install flutter rust bridge deps
run: |
git config --global core.longpaths true
cargo install flutter_rust_bridge_codegen --version ${{ env.FLUTTER_RUST_BRIDGE_VERSION }} --features "uuid"
Push-Location flutter ; flutter pub get ; Pop-Location
~/.cargo/bin/flutter_rust_bridge_codegen --rust-input ./src/flutter_ffi.rs --dart-output ./flutter/lib/generated_bridge.dart

View File

@ -1,6 +1,7 @@
import 'dart:async';
import 'dart:collection';
import 'package:dynamic_layouts/dynamic_layouts.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
@ -177,26 +178,29 @@ class _PeersViewState extends State<_PeersView> with WindowListener {
if (snapshot.hasData) {
final peers = snapshot.data!;
gFFI.peerTabModel.setCurrentTabCachedPeers(peers);
final cards = <Widget>[];
for (final peer in peers) {
final visibilityChild = VisibilityDetector(
key: ValueKey(_cardId(peer.id)),
onVisibilityChanged: onVisibilityChanged,
child: widget.peerCardBuilder(peer),
);
cards.add(isDesktop
? Obx(
() => SizedBox(
width: 220,
height:
peerCardUiType.value == PeerUiType.grid ? 140 : 42,
child: visibilityChild,
),
)
: SizedBox(width: mobileWidth, child: visibilityChild));
}
final child =
Wrap(spacing: space, runSpacing: space, children: cards);
final child = DynamicGridView.builder(
gridDelegate: SliverGridDelegateWithWrapping(
mainAxisSpacing: space / 2, crossAxisSpacing: space),
itemCount: peers.length,
itemBuilder: (BuildContext context, int index) {
final visibilityChild = VisibilityDetector(
key: ValueKey(_cardId(peers[index].id)),
onVisibilityChanged: onVisibilityChanged,
child: widget.peerCardBuilder(peers[index]),
);
return isDesktop
? Obx(
() => SizedBox(
width: 220,
height: peerCardUiType.value == PeerUiType.grid
? 140
: 42,
child: visibilityChild,
),
)
: SizedBox(width: mobileWidth, child: visibilityChild);
},
);
if (updateEvent == UpdateEvent.load) {
_curPeers.clear();
_curPeers.addAll(peers.map((e) => e.id));

View File

@ -138,7 +138,7 @@ class _ConnectionPageState extends State<ConnectionPage>
Divider().paddingOnly(right: 12),
])),
SliverFillRemaining(
hasScrollBody: false,
hasScrollBody: true,
child: PeerTabPage().paddingOnly(right: 12.0),
)
],

View File

@ -328,7 +328,7 @@ packages:
description:
path: "."
ref: HEAD
resolved-ref: "e51fddf7f3b46d4423b7aa79ba824a45a1ea1b7a"
resolved-ref: e51fddf7f3b46d4423b7aa79ba824a45a1ea1b7a
url: "https://github.com/rustdesk-org/rustdesk_desktop_multi_window"
source: git
version: "0.1.0"
@ -396,6 +396,15 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.0"
dynamic_layouts:
dependency: "direct main"
description:
path: "packages/dynamic_layouts"
ref: "0023d01996576e494094793a6552463f01c5627a"
resolved-ref: "0023d01996576e494094793a6552463f01c5627a"
url: "https://github.com/flutter/packages.git"
source: git
version: "0.0.1+1"
event_bus:
dependency: transitive
description:

View File

@ -100,6 +100,11 @@ dependencies:
uuid: ^3.0.7
auto_size_text_field: ^2.2.1
flex_color_picker: ^3.3.0
dynamic_layouts:
git:
url: https://github.com/flutter/packages.git
path: packages/dynamic_layouts
ref: 0023d01996576e494094793a6552463f01c5627a
dev_dependencies:
icons_launcher: ^2.0.4