Files
flutter_thingsboard_app/lib/modules/dashboard/main_dashboard_page.dart
2021-08-18 21:07:19 +03:00

167 lines
5.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:thingsboard_app/core/context/tb_context_widget.dart';
import 'package:thingsboard_app/modules/dashboard/dashboard.dart';
import 'package:thingsboard_app/widgets/tb_app_bar.dart';
class MainDashboardPageController {
DashboardController? _dashboardController;
_MainDashboardPageState? _mainDashboardPageState;
_setMainDashboardPageState(_MainDashboardPageState state) {
_mainDashboardPageState = state;
}
_setDashboardController(DashboardController controller) {
_dashboardController = controller;
}
Future<bool> dashboardGoBack() {
if (_dashboardController != null) {
return _dashboardController!.goBack();
} else {
return Future.value(true);
}
}
Future<void> openDashboard(String dashboardId, {String? dashboardTitle, String? state, bool? hideToolbar}) async {
if (dashboardTitle != null) {
_mainDashboardPageState?._updateTitle(dashboardTitle);
}
await _dashboardController?.openDashboard(dashboardId, state: state, hideToolbar: hideToolbar);
}
Future<void> activateDashboard() async {
await _dashboardController?.activateDashboard();
}
Future<void> deactivateDashboard() async {
await _dashboardController?.deactivateDashboard();
}
}
class MainDashboardPage extends TbContextWidget {
final String? _dashboardTitle;
final MainDashboardPageController? _controller;
MainDashboardPage(TbContext tbContext,
{MainDashboardPageController? controller,
String? dashboardTitle}):
_controller = controller,
_dashboardTitle = dashboardTitle,
super(tbContext);
@override
_MainDashboardPageState createState() => _MainDashboardPageState();
}
class _MainDashboardPageState extends TbContextState<MainDashboardPage> with TickerProviderStateMixin {
late ValueNotifier<String> dashboardTitleValue;
final ValueNotifier<bool> hasRightLayout = ValueNotifier(false);
DashboardController? _dashboardController;
late final Animation<double> rightLayoutMenuAnimation;
late final AnimationController rightLayoutMenuController;
@override
void initState() {
super.initState();
rightLayoutMenuController = AnimationController(
vsync: this,
duration: Duration(milliseconds: 200),
);
rightLayoutMenuAnimation = CurvedAnimation(
curve: Curves.linear,
parent: rightLayoutMenuController
);
if (widget._controller != null) {
widget._controller!._setMainDashboardPageState(this);
}
dashboardTitleValue = ValueNotifier(widget._dashboardTitle ?? 'Dashboard');
}
@override
void dispose() {
rightLayoutMenuController.dispose();
super.dispose();
}
_updateTitle(String newTitle) {
dashboardTitleValue.value = newTitle;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: TbAppBar(
tbContext,
leading: BackButton(
onPressed: () {
maybePop();
}
),
showLoadingIndicator: false,
elevation: 1,
shadowColor: Colors.transparent,
title: ValueListenableBuilder<String>(
valueListenable: dashboardTitleValue,
builder: (context, title, widget) {
return FittedBox(
fit: BoxFit.fitWidth,
alignment: Alignment.centerLeft,
child: Text(title)
);
},
),
actions: [
ValueListenableBuilder<bool>(
valueListenable: hasRightLayout,
builder: (context, _hasRightLayout, widget) {
if (_hasRightLayout) {
return IconButton(
onPressed: () => _dashboardController?.toggleRightLayout(),
icon: AnimatedIcon(
progress: rightLayoutMenuAnimation,
icon: AnimatedIcons.menu_close
)
);
} else {
return SizedBox.shrink();
}
}
)
],
),
body: Dashboard(
tbContext,
activeByDefault: false,
titleCallback: (title) {
dashboardTitleValue.value = title;
},
controllerCallback: (controller) {
_dashboardController = controller;
if (widget._controller != null) {
widget._controller!._setDashboardController(controller);
controller.hasRightLayout.addListener(() {
hasRightLayout.value = controller.hasRightLayout.value;
});
controller.rightLayoutOpened.addListener(() {
if(controller.rightLayoutOpened.value) {
rightLayoutMenuController.forward();
} else {
rightLayoutMenuController.reverse();
}
});
}
}
)
);
}
}