mirror of
https://github.com/rustdesk/rustdesk.git
synced 2024-11-27 14:59:02 +08:00
fix ab peers view, all peer tab use global peers model (#9475)
Use ChangeNotifierProvider<Peers>.value, and each peer tab has a global unique `Peers` model, then `load peers` and `build peers` will always be the same one. Signed-off-by: 21pages <sunboeasy@gmail.com>
This commit is contained in:
parent
c74bdcdfdb
commit
ffc73f86a0
@ -241,14 +241,15 @@ class _AddressBookState extends State<AddressBook> {
|
|||||||
bind.setLocalFlutterOption(k: kOptionCurrentAbName, v: value);
|
bind.setLocalFlutterOption(k: kOptionCurrentAbName, v: value);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
customButton: Obx(()=>Container(
|
customButton: Obx(() => Container(
|
||||||
height: stateGlobal.isPortrait.isFalse ? 48 : 40,
|
height: stateGlobal.isPortrait.isFalse ? 48 : 40,
|
||||||
child: Row(children: [
|
child: Row(children: [
|
||||||
Expanded(
|
Expanded(
|
||||||
child: buildItem(gFFI.abModel.currentName.value, button: true)),
|
child:
|
||||||
Icon(Icons.arrow_drop_down),
|
buildItem(gFFI.abModel.currentName.value, button: true)),
|
||||||
]),
|
Icon(Icons.arrow_drop_down),
|
||||||
)),
|
]),
|
||||||
|
)),
|
||||||
underline: Container(
|
underline: Container(
|
||||||
height: 0.7,
|
height: 0.7,
|
||||||
color: Theme.of(context).dividerColor.withOpacity(0.1),
|
color: Theme.of(context).dividerColor.withOpacity(0.1),
|
||||||
@ -358,7 +359,6 @@ class _AddressBookState extends State<AddressBook> {
|
|||||||
alignment: Alignment.topLeft,
|
alignment: Alignment.topLeft,
|
||||||
child: AddressBookPeersView(
|
child: AddressBookPeersView(
|
||||||
menuPadding: widget.menuPadding,
|
menuPadding: widget.menuPadding,
|
||||||
getInitPeers: () => gFFI.abModel.currentAbPeers,
|
|
||||||
)),
|
)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -509,19 +509,19 @@ class _AddressBookState extends State<AddressBook> {
|
|||||||
|
|
||||||
row({required Widget lable, required Widget input}) {
|
row({required Widget lable, required Widget input}) {
|
||||||
makeChild(bool isPortrait) => Row(
|
makeChild(bool isPortrait) => Row(
|
||||||
children: [
|
children: [
|
||||||
!isPortrait
|
!isPortrait
|
||||||
? ConstrainedBox(
|
? ConstrainedBox(
|
||||||
constraints: const BoxConstraints(minWidth: 100),
|
constraints: const BoxConstraints(minWidth: 100),
|
||||||
child: lable.marginOnly(right: 10))
|
child: lable.marginOnly(right: 10))
|
||||||
: SizedBox.shrink(),
|
: SizedBox.shrink(),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: ConstrainedBox(
|
child: ConstrainedBox(
|
||||||
constraints: const BoxConstraints(minWidth: 200),
|
constraints: const BoxConstraints(minWidth: 200),
|
||||||
child: input),
|
child: input),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
).marginOnly(bottom: !isPortrait ? 8 : 0);
|
).marginOnly(bottom: !isPortrait ? 8 : 0);
|
||||||
return Obx(() => makeChild(stateGlobal.isPortrait.isTrue));
|
return Obx(() => makeChild(stateGlobal.isPortrait.isTrue));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -546,23 +546,28 @@ class _AddressBookState extends State<AddressBook> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
input: Obx(() => TextField(
|
input: Obx(() => TextField(
|
||||||
controller: idController,
|
controller: idController,
|
||||||
inputFormatters: [IDTextInputFormatter()],
|
inputFormatters: [IDTextInputFormatter()],
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: stateGlobal.isPortrait.isFalse ? null : translate('ID'),
|
labelText: stateGlobal.isPortrait.isFalse
|
||||||
errorText: errorMsg,
|
? null
|
||||||
errorMaxLines: 5),
|
: translate('ID'),
|
||||||
))),
|
errorText: errorMsg,
|
||||||
|
errorMaxLines: 5),
|
||||||
|
))),
|
||||||
row(
|
row(
|
||||||
lable: Text(
|
lable: Text(
|
||||||
translate('Alias'),
|
translate('Alias'),
|
||||||
style: style,
|
style: style,
|
||||||
),
|
),
|
||||||
input: Obx(() => TextField(
|
input: Obx(() => TextField(
|
||||||
controller: aliasController,
|
controller: aliasController,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: stateGlobal.isPortrait.isFalse ? null : translate('Alias'),
|
labelText: stateGlobal.isPortrait.isFalse
|
||||||
),)),
|
? null
|
||||||
|
: translate('Alias'),
|
||||||
|
),
|
||||||
|
)),
|
||||||
),
|
),
|
||||||
if (isCurrentAbShared)
|
if (isCurrentAbShared)
|
||||||
row(
|
row(
|
||||||
@ -570,25 +575,29 @@ class _AddressBookState extends State<AddressBook> {
|
|||||||
translate('Password'),
|
translate('Password'),
|
||||||
style: style,
|
style: style,
|
||||||
),
|
),
|
||||||
input: Obx(() => TextField(
|
input: Obx(
|
||||||
controller: passwordController,
|
() => TextField(
|
||||||
obscureText: !passwordVisible,
|
controller: passwordController,
|
||||||
decoration: InputDecoration(
|
obscureText: !passwordVisible,
|
||||||
labelText: stateGlobal.isPortrait.isFalse ? null : translate('Password'),
|
decoration: InputDecoration(
|
||||||
suffixIcon: IconButton(
|
labelText: stateGlobal.isPortrait.isFalse
|
||||||
icon: Icon(
|
? null
|
||||||
passwordVisible
|
: translate('Password'),
|
||||||
? Icons.visibility
|
suffixIcon: IconButton(
|
||||||
: Icons.visibility_off,
|
icon: Icon(
|
||||||
color: MyTheme.lightTheme.primaryColor),
|
passwordVisible
|
||||||
onPressed: () {
|
? Icons.visibility
|
||||||
setState(() {
|
: Icons.visibility_off,
|
||||||
passwordVisible = !passwordVisible;
|
color: MyTheme.lightTheme.primaryColor),
|
||||||
});
|
onPressed: () {
|
||||||
},
|
setState(() {
|
||||||
|
passwordVisible = !passwordVisible;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),)),
|
)),
|
||||||
if (gFFI.abModel.currentAbTags.isNotEmpty)
|
if (gFFI.abModel.currentAbTags.isNotEmpty)
|
||||||
Align(
|
Align(
|
||||||
alignment: Alignment.centerLeft,
|
alignment: Alignment.centerLeft,
|
||||||
|
@ -83,8 +83,8 @@ class _MyGroupState extends State<MyGroup> {
|
|||||||
child: Align(
|
child: Align(
|
||||||
alignment: Alignment.topLeft,
|
alignment: Alignment.topLeft,
|
||||||
child: MyGroupPeerView(
|
child: MyGroupPeerView(
|
||||||
menuPadding: widget.menuPadding,
|
menuPadding: widget.menuPadding,
|
||||||
getInitPeers: () => gFFI.groupModel.peers)),
|
)),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
@ -115,8 +115,8 @@ class _MyGroupState extends State<MyGroup> {
|
|||||||
child: Align(
|
child: Align(
|
||||||
alignment: Alignment.topLeft,
|
alignment: Alignment.topLeft,
|
||||||
child: MyGroupPeerView(
|
child: MyGroupPeerView(
|
||||||
menuPadding: widget.menuPadding,
|
menuPadding: widget.menuPadding,
|
||||||
getInitPeers: () => gFFI.groupModel.peers)),
|
)),
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
@ -6,6 +6,7 @@ import 'package:flutter/foundation.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_hbb/consts.dart';
|
import 'package:flutter_hbb/consts.dart';
|
||||||
import 'package:flutter_hbb/desktop/widgets/scroll_wrapper.dart';
|
import 'package:flutter_hbb/desktop/widgets/scroll_wrapper.dart';
|
||||||
|
import 'package:flutter_hbb/models/peer_tab_model.dart';
|
||||||
import 'package:flutter_hbb/models/state_model.dart';
|
import 'package:flutter_hbb/models/state_model.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
@ -42,6 +43,14 @@ class LoadEvent {
|
|||||||
static const String group = 'load_group_peers';
|
static const String group = 'load_group_peers';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class PeersModelName {
|
||||||
|
static const String recent = 'recent peer';
|
||||||
|
static const String favorite = 'fav peer';
|
||||||
|
static const String lan = 'discovered peer';
|
||||||
|
static const String addressBook = 'address book peer';
|
||||||
|
static const String group = 'group peer';
|
||||||
|
}
|
||||||
|
|
||||||
/// for peer search text, global obs value
|
/// for peer search text, global obs value
|
||||||
final peerSearchText = "".obs;
|
final peerSearchText = "".obs;
|
||||||
|
|
||||||
@ -128,8 +137,9 @@ class _PeersViewState extends State<_PeersView>
|
|||||||
//
|
//
|
||||||
// Although `onWindowRestore()` is called after `onWindowBlur()` in my test,
|
// Although `onWindowRestore()` is called after `onWindowBlur()` in my test,
|
||||||
// we need the following comparison to ensure that `_isActive` is true in the end.
|
// we need the following comparison to ensure that `_isActive` is true in the end.
|
||||||
if (isWindows && DateTime.now().difference(_lastWindowRestoreTime) <
|
if (isWindows &&
|
||||||
const Duration(milliseconds: 300)) {
|
DateTime.now().difference(_lastWindowRestoreTime) <
|
||||||
|
const Duration(milliseconds: 300)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_queryCount = _maxQueryCount;
|
_queryCount = _maxQueryCount;
|
||||||
@ -170,8 +180,8 @@ class _PeersViewState extends State<_PeersView>
|
|||||||
// We should avoid too many rebuilds. MacOS(m1, 14.6.1) on Flutter 3.19.6.
|
// We should avoid too many rebuilds. MacOS(m1, 14.6.1) on Flutter 3.19.6.
|
||||||
// Continious rebuilds of `ChangeNotifierProvider` will cause memory leak.
|
// Continious rebuilds of `ChangeNotifierProvider` will cause memory leak.
|
||||||
// Simple demo can reproduce this issue.
|
// Simple demo can reproduce this issue.
|
||||||
return ChangeNotifierProvider<Peers>(
|
return ChangeNotifierProvider<Peers>.value(
|
||||||
create: (context) => widget.peers,
|
value: widget.peers,
|
||||||
child: Consumer<Peers>(builder: (context, peers, child) {
|
child: Consumer<Peers>(builder: (context, peers, child) {
|
||||||
if (peers.peers.isEmpty) {
|
if (peers.peers.isEmpty) {
|
||||||
gFFI.peerTabModel.setCurrentTabCachedPeers([]);
|
gFFI.peerTabModel.setCurrentTabCachedPeers([]);
|
||||||
@ -403,28 +413,39 @@ class _PeersViewState extends State<_PeersView>
|
|||||||
}
|
}
|
||||||
|
|
||||||
abstract class BasePeersView extends StatelessWidget {
|
abstract class BasePeersView extends StatelessWidget {
|
||||||
final String name;
|
final PeerTabIndex peerTabIndex;
|
||||||
final String loadEvent;
|
|
||||||
final PeerFilter? peerFilter;
|
final PeerFilter? peerFilter;
|
||||||
final PeerCardBuilder peerCardBuilder;
|
final PeerCardBuilder peerCardBuilder;
|
||||||
final GetInitPeers? getInitPeers;
|
|
||||||
|
|
||||||
const BasePeersView({
|
const BasePeersView({
|
||||||
Key? key,
|
Key? key,
|
||||||
required this.name,
|
required this.peerTabIndex,
|
||||||
required this.loadEvent,
|
|
||||||
this.peerFilter,
|
this.peerFilter,
|
||||||
required this.peerCardBuilder,
|
required this.peerCardBuilder,
|
||||||
required this.getInitPeers,
|
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
Peers peers;
|
||||||
|
switch (peerTabIndex) {
|
||||||
|
case PeerTabIndex.recent:
|
||||||
|
peers = gFFI.recentPeersModel;
|
||||||
|
break;
|
||||||
|
case PeerTabIndex.fav:
|
||||||
|
peers = gFFI.favoritePeersModel;
|
||||||
|
break;
|
||||||
|
case PeerTabIndex.lan:
|
||||||
|
peers = gFFI.lanPeersModel;
|
||||||
|
break;
|
||||||
|
case PeerTabIndex.ab:
|
||||||
|
peers = gFFI.abModel.peersModel;
|
||||||
|
break;
|
||||||
|
case PeerTabIndex.group:
|
||||||
|
peers = gFFI.groupModel.peersModel;
|
||||||
|
break;
|
||||||
|
}
|
||||||
return _PeersView(
|
return _PeersView(
|
||||||
peers:
|
peers: peers, peerFilter: peerFilter, peerCardBuilder: peerCardBuilder);
|
||||||
Peers(name: name, loadEvent: loadEvent, getInitPeers: getInitPeers),
|
|
||||||
peerFilter: peerFilter,
|
|
||||||
peerCardBuilder: peerCardBuilder);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -433,13 +454,11 @@ class RecentPeersView extends BasePeersView {
|
|||||||
{Key? key, EdgeInsets? menuPadding, ScrollController? scrollController})
|
{Key? key, EdgeInsets? menuPadding, ScrollController? scrollController})
|
||||||
: super(
|
: super(
|
||||||
key: key,
|
key: key,
|
||||||
name: 'recent peer',
|
peerTabIndex: PeerTabIndex.recent,
|
||||||
loadEvent: LoadEvent.recent,
|
|
||||||
peerCardBuilder: (Peer peer) => RecentPeerCard(
|
peerCardBuilder: (Peer peer) => RecentPeerCard(
|
||||||
peer: peer,
|
peer: peer,
|
||||||
menuPadding: menuPadding,
|
menuPadding: menuPadding,
|
||||||
),
|
),
|
||||||
getInitPeers: null,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -455,13 +474,11 @@ class FavoritePeersView extends BasePeersView {
|
|||||||
{Key? key, EdgeInsets? menuPadding, ScrollController? scrollController})
|
{Key? key, EdgeInsets? menuPadding, ScrollController? scrollController})
|
||||||
: super(
|
: super(
|
||||||
key: key,
|
key: key,
|
||||||
name: 'favorite peer',
|
peerTabIndex: PeerTabIndex.fav,
|
||||||
loadEvent: LoadEvent.favorite,
|
|
||||||
peerCardBuilder: (Peer peer) => FavoritePeerCard(
|
peerCardBuilder: (Peer peer) => FavoritePeerCard(
|
||||||
peer: peer,
|
peer: peer,
|
||||||
menuPadding: menuPadding,
|
menuPadding: menuPadding,
|
||||||
),
|
),
|
||||||
getInitPeers: null,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -477,13 +494,11 @@ class DiscoveredPeersView extends BasePeersView {
|
|||||||
{Key? key, EdgeInsets? menuPadding, ScrollController? scrollController})
|
{Key? key, EdgeInsets? menuPadding, ScrollController? scrollController})
|
||||||
: super(
|
: super(
|
||||||
key: key,
|
key: key,
|
||||||
name: 'discovered peer',
|
peerTabIndex: PeerTabIndex.lan,
|
||||||
loadEvent: LoadEvent.lan,
|
|
||||||
peerCardBuilder: (Peer peer) => DiscoveredPeerCard(
|
peerCardBuilder: (Peer peer) => DiscoveredPeerCard(
|
||||||
peer: peer,
|
peer: peer,
|
||||||
menuPadding: menuPadding,
|
menuPadding: menuPadding,
|
||||||
),
|
),
|
||||||
getInitPeers: null,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -496,21 +511,16 @@ class DiscoveredPeersView extends BasePeersView {
|
|||||||
|
|
||||||
class AddressBookPeersView extends BasePeersView {
|
class AddressBookPeersView extends BasePeersView {
|
||||||
AddressBookPeersView(
|
AddressBookPeersView(
|
||||||
{Key? key,
|
{Key? key, EdgeInsets? menuPadding, ScrollController? scrollController})
|
||||||
EdgeInsets? menuPadding,
|
|
||||||
ScrollController? scrollController,
|
|
||||||
required GetInitPeers getInitPeers})
|
|
||||||
: super(
|
: super(
|
||||||
key: key,
|
key: key,
|
||||||
name: 'address book peer',
|
peerTabIndex: PeerTabIndex.ab,
|
||||||
loadEvent: LoadEvent.addressBook,
|
|
||||||
peerFilter: (Peer peer) =>
|
peerFilter: (Peer peer) =>
|
||||||
_hitTag(gFFI.abModel.selectedTags, peer.tags),
|
_hitTag(gFFI.abModel.selectedTags, peer.tags),
|
||||||
peerCardBuilder: (Peer peer) => AddressBookPeerCard(
|
peerCardBuilder: (Peer peer) => AddressBookPeerCard(
|
||||||
peer: peer,
|
peer: peer,
|
||||||
menuPadding: menuPadding,
|
menuPadding: menuPadding,
|
||||||
),
|
),
|
||||||
getInitPeers: getInitPeers,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
static bool _hitTag(List<dynamic> selectedTags, List<dynamic> idents) {
|
static bool _hitTag(List<dynamic> selectedTags, List<dynamic> idents) {
|
||||||
@ -537,20 +547,15 @@ class AddressBookPeersView extends BasePeersView {
|
|||||||
|
|
||||||
class MyGroupPeerView extends BasePeersView {
|
class MyGroupPeerView extends BasePeersView {
|
||||||
MyGroupPeerView(
|
MyGroupPeerView(
|
||||||
{Key? key,
|
{Key? key, EdgeInsets? menuPadding, ScrollController? scrollController})
|
||||||
EdgeInsets? menuPadding,
|
|
||||||
ScrollController? scrollController,
|
|
||||||
required GetInitPeers getInitPeers})
|
|
||||||
: super(
|
: super(
|
||||||
key: key,
|
key: key,
|
||||||
name: 'group peer',
|
peerTabIndex: PeerTabIndex.group,
|
||||||
loadEvent: LoadEvent.group,
|
|
||||||
peerFilter: filter,
|
peerFilter: filter,
|
||||||
peerCardBuilder: (Peer peer) => MyGroupPeerCard(
|
peerCardBuilder: (Peer peer) => MyGroupPeerCard(
|
||||||
peer: peer,
|
peer: peer,
|
||||||
menuPadding: menuPadding,
|
menuPadding: menuPadding,
|
||||||
),
|
),
|
||||||
getInitPeers: getInitPeers,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
static bool filter(Peer peer) {
|
static bool filter(Peer peer) {
|
||||||
|
@ -66,10 +66,16 @@ class AbModel {
|
|||||||
var listInitialized = false;
|
var listInitialized = false;
|
||||||
var _maxPeerOneAb = 0;
|
var _maxPeerOneAb = 0;
|
||||||
|
|
||||||
|
late final Peers peersModel;
|
||||||
|
|
||||||
WeakReference<FFI> parent;
|
WeakReference<FFI> parent;
|
||||||
|
|
||||||
AbModel(this.parent) {
|
AbModel(this.parent) {
|
||||||
addressbooks.clear();
|
addressbooks.clear();
|
||||||
|
peersModel = Peers(
|
||||||
|
name: PeersModelName.addressBook,
|
||||||
|
getInitPeers: () => currentAbPeers,
|
||||||
|
loadEvent: LoadEvent.addressBook);
|
||||||
if (desktopType == DesktopType.main) {
|
if (desktopType == DesktopType.main) {
|
||||||
Timer.periodic(Duration(milliseconds: 500), (timer) async {
|
Timer.periodic(Duration(milliseconds: 500), (timer) async {
|
||||||
if (_timerCounter++ % 6 == 0) {
|
if (_timerCounter++ % 6 == 0) {
|
||||||
|
@ -23,7 +23,14 @@ class GroupModel {
|
|||||||
|
|
||||||
bool get emtpy => users.isEmpty && peers.isEmpty;
|
bool get emtpy => users.isEmpty && peers.isEmpty;
|
||||||
|
|
||||||
GroupModel(this.parent);
|
late final Peers peersModel;
|
||||||
|
|
||||||
|
GroupModel(this.parent) {
|
||||||
|
peersModel = Peers(
|
||||||
|
name: PeersModelName.group,
|
||||||
|
getInitPeers: () => peers,
|
||||||
|
loadEvent: LoadEvent.group);
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> pull({force = true, quiet = false}) async {
|
Future<void> pull({force = true, quiet = false}) async {
|
||||||
if (bind.isDisableGroupPanel()) return;
|
if (bind.isDisableGroupPanel()) return;
|
||||||
|
@ -7,12 +7,14 @@ import 'dart:ui' as ui;
|
|||||||
import 'package:desktop_multi_window/desktop_multi_window.dart';
|
import 'package:desktop_multi_window/desktop_multi_window.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter_hbb/common/widgets/peers_view.dart';
|
||||||
import 'package:flutter_hbb/consts.dart';
|
import 'package:flutter_hbb/consts.dart';
|
||||||
import 'package:flutter_hbb/models/ab_model.dart';
|
import 'package:flutter_hbb/models/ab_model.dart';
|
||||||
import 'package:flutter_hbb/models/chat_model.dart';
|
import 'package:flutter_hbb/models/chat_model.dart';
|
||||||
import 'package:flutter_hbb/models/cm_file_model.dart';
|
import 'package:flutter_hbb/models/cm_file_model.dart';
|
||||||
import 'package:flutter_hbb/models/file_model.dart';
|
import 'package:flutter_hbb/models/file_model.dart';
|
||||||
import 'package:flutter_hbb/models/group_model.dart';
|
import 'package:flutter_hbb/models/group_model.dart';
|
||||||
|
import 'package:flutter_hbb/models/peer_model.dart';
|
||||||
import 'package:flutter_hbb/models/peer_tab_model.dart';
|
import 'package:flutter_hbb/models/peer_tab_model.dart';
|
||||||
import 'package:flutter_hbb/models/server_model.dart';
|
import 'package:flutter_hbb/models/server_model.dart';
|
||||||
import 'package:flutter_hbb/models/user_model.dart';
|
import 'package:flutter_hbb/models/user_model.dart';
|
||||||
@ -2397,6 +2399,9 @@ class FFI {
|
|||||||
late final ElevationModel elevationModel; // session
|
late final ElevationModel elevationModel; // session
|
||||||
late final CmFileModel cmFileModel; // cm
|
late final CmFileModel cmFileModel; // cm
|
||||||
late final TextureModel textureModel; //session
|
late final TextureModel textureModel; //session
|
||||||
|
late final Peers recentPeersModel; // global
|
||||||
|
late final Peers favoritePeersModel; // global
|
||||||
|
late final Peers lanPeersModel; // global
|
||||||
|
|
||||||
FFI(SessionID? sId) {
|
FFI(SessionID? sId) {
|
||||||
sessionId = sId ?? (isDesktop ? Uuid().v4obj() : _constSessionId);
|
sessionId = sId ?? (isDesktop ? Uuid().v4obj() : _constSessionId);
|
||||||
@ -2417,6 +2422,16 @@ class FFI {
|
|||||||
elevationModel = ElevationModel(WeakReference(this));
|
elevationModel = ElevationModel(WeakReference(this));
|
||||||
cmFileModel = CmFileModel(WeakReference(this));
|
cmFileModel = CmFileModel(WeakReference(this));
|
||||||
textureModel = TextureModel(WeakReference(this));
|
textureModel = TextureModel(WeakReference(this));
|
||||||
|
recentPeersModel = Peers(
|
||||||
|
name: PeersModelName.recent,
|
||||||
|
loadEvent: LoadEvent.recent,
|
||||||
|
getInitPeers: null);
|
||||||
|
favoritePeersModel = Peers(
|
||||||
|
name: PeersModelName.favorite,
|
||||||
|
loadEvent: LoadEvent.favorite,
|
||||||
|
getInitPeers: null);
|
||||||
|
lanPeersModel = Peers(
|
||||||
|
name: PeersModelName.lan, loadEvent: LoadEvent.lan, getInitPeers: null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Mobile reuse FFI
|
/// Mobile reuse FFI
|
||||||
|
Loading…
Reference in New Issue
Block a user