mobile_nebula/lib/components/SimplePage.dart

106 lines
3.3 KiB
Dart
Raw Permalink Normal View History

2020-07-27 20:43:58 +00:00
import 'package:flutter/cupertino.dart' as cupertino;
import 'package:flutter/material.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:mobile_nebula/services/utils.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
enum SimpleScrollable {
none,
vertical,
horizontal,
both,
}
class SimplePage extends StatelessWidget {
const SimplePage(
{Key key,
this.title,
@required this.child,
this.leadingAction,
this.trailingActions = const [],
this.scrollable = SimpleScrollable.vertical,
this.scrollbar = true,
this.scrollController,
this.bottomBar,
this.onRefresh,
this.onLoading,
this.refreshController})
: super(key: key);
final String title;
final Widget child;
final SimpleScrollable scrollable;
final ScrollController scrollController;
/// Set this to true to force draw a scrollbar without a scroll view, this is helpful for pages with Reorderable listviews
/// This is set to true if you have any scrollable other than none
final bool scrollbar;
final Widget bottomBar;
/// If no leading action is provided then a default "Back" widget than pops the page will be provided
final Widget leadingAction;
final List<Widget> trailingActions;
final VoidCallback onRefresh;
final VoidCallback onLoading;
final RefreshController refreshController;
@override
Widget build(BuildContext context) {
Widget realChild = child;
var addScrollbar = this.scrollbar;
if (scrollable == SimpleScrollable.vertical || scrollable == SimpleScrollable.both) {
realChild = SingleChildScrollView(scrollDirection: Axis.vertical, child: realChild, controller: refreshController == null ? scrollController : null);
addScrollbar = true;
}
if (scrollable == SimpleScrollable.horizontal || scrollable == SimpleScrollable.both) {
realChild = SingleChildScrollView(scrollDirection: Axis.horizontal, child: realChild);
addScrollbar = true;
}
if (refreshController != null) {
realChild = RefreshConfiguration(
headerTriggerDistance: 100,
footerTriggerDistance: -100,
maxUnderScrollExtent: 100,
child: SmartRefresher(
scrollController: scrollController,
onRefresh: onRefresh,
onLoading: onLoading,
controller: refreshController,
child: realChild,
enablePullUp: onLoading != null,
enablePullDown: onRefresh != null,
footer: ClassicFooter(loadStyle: LoadStyle.ShowWhenLoading),
));
addScrollbar = true;
}
if (addScrollbar) {
realChild = Scrollbar(child: realChild);
}
if (bottomBar != null) {
realChild = Column(children: [
Expanded(child: realChild),
bottomBar,
]);
}
return PlatformScaffold(
backgroundColor: cupertino.CupertinoColors.systemGroupedBackground.resolveFrom(context),
appBar: PlatformAppBar(
title: Text(title),
leading: leadingAction != null ? leadingAction : Utils.leadingBackWidget(context),
trailingActions: trailingActions,
ios: (_) => CupertinoNavigationBarData(
transitionBetweenRoutes: false,
),
),
body: SafeArea(child: realChild));
}
}