You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.1 KiB
Dart
98 lines
2.1 KiB
Dart
|
5 years ago
|
/*
|
||
|
|
* Copyright © 2020, Simform Solutions
|
||
|
|
* All rights reserved.
|
||
|
|
* https://github.com/simformsolutions/flutter_showcaseview
|
||
|
|
*/
|
||
|
|
|
||
|
|
/*
|
||
|
|
Customized By: Ibrahim Albitar
|
||
|
|
|
||
|
|
*/
|
||
|
|
|
||
|
|
import 'package:flutter/material.dart';
|
||
|
|
|
||
|
|
class ShowCaseWidget extends StatefulWidget {
|
||
|
|
final Builder builder;
|
||
|
|
final VoidCallback onFinish;
|
||
|
|
|
||
|
|
const ShowCaseWidget({@required this.builder, this.onFinish});
|
||
|
|
|
||
|
|
static activeTargetWidget(BuildContext context) {
|
||
|
|
return context
|
||
|
|
.dependOnInheritedWidgetOfExactType<_InheritedShowCaseView>()
|
||
|
|
.activeWidgetIds;
|
||
|
|
}
|
||
|
|
|
||
|
|
static ShowCaseWidgetState of(BuildContext context) {
|
||
|
|
ShowCaseWidgetState state =
|
||
|
|
context.findAncestorStateOfType<ShowCaseWidgetState>();
|
||
|
|
if (state != null) {
|
||
|
|
return context.findAncestorStateOfType<ShowCaseWidgetState>();
|
||
|
|
} else {
|
||
|
|
throw Exception('Please provide ShowCaseView context');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
@override
|
||
|
|
ShowCaseWidgetState createState() => ShowCaseWidgetState();
|
||
|
|
}
|
||
|
|
|
||
|
|
class ShowCaseWidgetState extends State<ShowCaseWidget> {
|
||
|
|
List<GlobalKey> ids;
|
||
|
|
int activeWidgetId;
|
||
|
|
|
||
|
|
void startShowCase(List<GlobalKey> widgetIds) {
|
||
|
|
setState(() {
|
||
|
|
this.ids = widgetIds;
|
||
|
|
activeWidgetId = 0;
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
void completed(GlobalKey id) {
|
||
|
|
if (ids != null && ids[activeWidgetId] == id) {
|
||
|
|
setState(() {
|
||
|
|
++activeWidgetId;
|
||
|
|
|
||
|
|
if (activeWidgetId >= ids.length) {
|
||
|
|
_cleanupAfterSteps();
|
||
|
|
if (widget.onFinish != null) {
|
||
|
|
widget.onFinish();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void dismiss() {
|
||
|
|
setState(() {
|
||
|
|
_cleanupAfterSteps();
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
void _cleanupAfterSteps() {
|
||
|
|
ids = null;
|
||
|
|
activeWidgetId = null;
|
||
|
|
}
|
||
|
|
|
||
|
|
@override
|
||
|
|
Widget build(BuildContext context) {
|
||
|
|
return _InheritedShowCaseView(
|
||
|
|
child: widget.builder,
|
||
|
|
activeWidgetIds: ids?.elementAt(activeWidgetId),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
class _InheritedShowCaseView extends InheritedWidget {
|
||
|
|
final GlobalKey activeWidgetIds;
|
||
|
|
|
||
|
|
_InheritedShowCaseView({
|
||
|
|
@required this.activeWidgetIds,
|
||
|
|
@required child,
|
||
|
|
}) : super(child: child);
|
||
|
|
|
||
|
|
@override
|
||
|
|
bool updateShouldNotify(_InheritedShowCaseView oldWidget) =>
|
||
|
|
oldWidget.activeWidgetIds != activeWidgetIds;
|
||
|
|
}
|