workaround: PageView reload
This commit is contained in:
parent
3d5aca18d6
commit
ac1ae9fc3b
@ -327,14 +327,32 @@ class DesktopTab extends StatelessWidget {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<Widget> _tabWidgets = [];
|
||||||
Widget _buildPageView() {
|
Widget _buildPageView() {
|
||||||
return _buildBlock(
|
return _buildBlock(
|
||||||
child: Obx(() => PageView(
|
child: Obx(() => PageView(
|
||||||
controller: state.value.pageController,
|
controller: state.value.pageController,
|
||||||
physics: NeverScrollableScrollPhysics(),
|
physics: NeverScrollableScrollPhysics(),
|
||||||
children: state.value.tabs
|
children: () {
|
||||||
.map((tab) => tab.page)
|
/// to-do refactor, separate connection state and UI state for remote session.
|
||||||
.toList(growable: false))));
|
/// [workaround] PageView children need an immutable list, after it has been passed into PageView
|
||||||
|
final tabLen = state.value.tabs.length;
|
||||||
|
if (tabLen == _tabWidgets.length) {
|
||||||
|
return _tabWidgets;
|
||||||
|
} else if (_tabWidgets.isNotEmpty &&
|
||||||
|
tabLen == _tabWidgets.length + 1) {
|
||||||
|
/// On add. Use the previous list(pointer) to prevent item's state init twice.
|
||||||
|
/// *[_tabWidgets.isNotEmpty] means TabsWindow(remote_tab_page or file_manager_tab_page) opened before, but was hidden. In this case, we have to reload, otherwise the child can't be built.
|
||||||
|
_tabWidgets.add(state.value.tabs.last.page);
|
||||||
|
return _tabWidgets;
|
||||||
|
} else {
|
||||||
|
/// On remove or change. Use new list(pointer) to reload list children so that items loading order is normal.
|
||||||
|
/// the Widgets in list must enable [AutomaticKeepAliveClientMixin]
|
||||||
|
final newList = state.value.tabs.map((v) => v.page).toList();
|
||||||
|
_tabWidgets = newList;
|
||||||
|
return newList;
|
||||||
|
}
|
||||||
|
}())));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Check whether to show ListView
|
/// Check whether to show ListView
|
||||||
@ -765,7 +783,8 @@ class _ListView extends StatelessWidget {
|
|||||||
tabBuilder: tabBuilder,
|
tabBuilder: tabBuilder,
|
||||||
tabMenuBuilder: tabMenuBuilder,
|
tabMenuBuilder: tabMenuBuilder,
|
||||||
maxLabelWidth: maxLabelWidth,
|
maxLabelWidth: maxLabelWidth,
|
||||||
selectedTabBackgroundColor: selectedTabBackgroundColor ?? MyTheme.tabbar(context).selectedTabBackgroundColor,
|
selectedTabBackgroundColor: selectedTabBackgroundColor ??
|
||||||
|
MyTheme.tabbar(context).selectedTabBackgroundColor,
|
||||||
unSelectedTabBackgroundColor: unSelectedTabBackgroundColor,
|
unSelectedTabBackgroundColor: unSelectedTabBackgroundColor,
|
||||||
);
|
);
|
||||||
}).toList()));
|
}).toList()));
|
||||||
@ -1119,7 +1138,8 @@ class TabbarTheme extends ThemeExtension<TabbarTheme> {
|
|||||||
dividerColor: dividerColor ?? this.dividerColor,
|
dividerColor: dividerColor ?? this.dividerColor,
|
||||||
hoverColor: hoverColor ?? this.hoverColor,
|
hoverColor: hoverColor ?? this.hoverColor,
|
||||||
closeHoverColor: closeHoverColor ?? this.closeHoverColor,
|
closeHoverColor: closeHoverColor ?? this.closeHoverColor,
|
||||||
selectedTabBackgroundColor: selectedTabBackgroundColor ?? this.selectedTabBackgroundColor,
|
selectedTabBackgroundColor:
|
||||||
|
selectedTabBackgroundColor ?? this.selectedTabBackgroundColor,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1145,7 +1165,8 @@ class TabbarTheme extends ThemeExtension<TabbarTheme> {
|
|||||||
dividerColor: Color.lerp(dividerColor, other.dividerColor, t),
|
dividerColor: Color.lerp(dividerColor, other.dividerColor, t),
|
||||||
hoverColor: Color.lerp(hoverColor, other.hoverColor, t),
|
hoverColor: Color.lerp(hoverColor, other.hoverColor, t),
|
||||||
closeHoverColor: Color.lerp(closeHoverColor, other.closeHoverColor, t),
|
closeHoverColor: Color.lerp(closeHoverColor, other.closeHoverColor, t),
|
||||||
selectedTabBackgroundColor: Color.lerp(selectedTabBackgroundColor, other.selectedTabBackgroundColor, t),
|
selectedTabBackgroundColor: Color.lerp(
|
||||||
|
selectedTabBackgroundColor, other.selectedTabBackgroundColor, t),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,7 +17,6 @@ import 'package:flutter_hbb/models/server_model.dart';
|
|||||||
import 'package:flutter_hbb/models/user_model.dart';
|
import 'package:flutter_hbb/models/user_model.dart';
|
||||||
import 'package:flutter_hbb/models/state_model.dart';
|
import 'package:flutter_hbb/models/state_model.dart';
|
||||||
import 'package:flutter_hbb/common/shared_state.dart';
|
import 'package:flutter_hbb/common/shared_state.dart';
|
||||||
import 'package:flutter_hbb/utils/multi_window_manager.dart';
|
|
||||||
import 'package:tuple/tuple.dart';
|
import 'package:tuple/tuple.dart';
|
||||||
import 'package:image/image.dart' as img2;
|
import 'package:image/image.dart' as img2;
|
||||||
import 'package:flutter_custom_cursor/cursor_manager.dart';
|
import 'package:flutter_custom_cursor/cursor_manager.dart';
|
||||||
@ -25,7 +24,6 @@ import 'package:flutter_svg/flutter_svg.dart';
|
|||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
import '../common.dart';
|
import '../common.dart';
|
||||||
import '../common/shared_state.dart';
|
|
||||||
import '../utils/image.dart' as img;
|
import '../utils/image.dart' as img;
|
||||||
import '../mobile/widgets/dialog.dart';
|
import '../mobile/widgets/dialog.dart';
|
||||||
import 'input_model.dart';
|
import 'input_model.dart';
|
||||||
@ -1348,13 +1346,13 @@ class FFI {
|
|||||||
canvasModel.y, canvasModel.scale, ffiModel.pi.currentDisplay);
|
canvasModel.y, canvasModel.scale, ffiModel.pi.currentDisplay);
|
||||||
}
|
}
|
||||||
bind.sessionClose(id: id);
|
bind.sessionClose(id: id);
|
||||||
id = '';
|
|
||||||
imageModel.update(null);
|
imageModel.update(null);
|
||||||
cursorModel.clear();
|
cursorModel.clear();
|
||||||
ffiModel.clear();
|
ffiModel.clear();
|
||||||
canvasModel.clear();
|
canvasModel.clear();
|
||||||
inputModel.resetModifiers();
|
inputModel.resetModifiers();
|
||||||
debugPrint('model $id closed');
|
debugPrint('model $id closed');
|
||||||
|
id = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
void setMethodCallHandler(FMethod callback) {
|
void setMethodCallHandler(FMethod callback) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user