forked from core/mobile_nebula
108 lines
3.4 KiB
Dart
108 lines
3.4 KiB
Dart
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,
|
|
required 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 Reorder-able 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,
|
|
cupertino: (_, __) => CupertinoNavigationBarData(
|
|
transitionBetweenRoutes: false,
|
|
),
|
|
),
|
|
body: SafeArea(child: realChild));
|
|
}
|
|
}
|