/* * 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(); if (state != null) { return context.findAncestorStateOfType(); } else { throw Exception('Please provide ShowCaseView context'); } } @override ShowCaseWidgetState createState() => ShowCaseWidgetState(); } class ShowCaseWidgetState extends State { List ids; int activeWidgetId; void startShowCase(List 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; }