showTour static method

Future<void> showTour(
  1. BuildContext context,
  2. Config config, {
  3. required List tours,
  4. required ScrollController scrollController,
})

Implementation

static Future<void> showTour(BuildContext context, Config config,
    {required List<dynamic> tours, required ScrollController scrollController
    // required Widget widget,
    }) async {
  var isDarkTheme = Theme.of(context).brightness == Brightness.dark;
  List<TargetFocus> targets = [];

  for (int i = 0; i < tours.length; i++) {
    String body = tours[i]["body"].toString();
    final key = config.keys[tours[i]["element"].toString()];
    await scrollToTarget(key, scrollController);
    WebViewController webViewController = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setNavigationDelegate(
        NavigationDelegate(
          onProgress: (int progress) {
            // Update loading bar.
          },
          onPageStarted: (String url) {},
          onPageFinished: (String url) {},
          onHttpError: (HttpResponseError error) {},
          onWebResourceError: (WebResourceError error) {},
          onNavigationRequest: (NavigationRequest request) {
            if (request.url.startsWith('https://www.youtube.com/')) {
              return NavigationDecision.prevent;
            }
            return NavigationDecision.navigate;
          },
        ),
      );
    targets.add(
      TargetFocus(
        identify: "",
        shape: tours[i]["shape"].toString().toLowerCase() == "rect"
            ? ShapeLightFocus.RRect
            : ShapeLightFocus.Circle,
        keyTarget: config.keys[tours[i]["element"].toString()],
        alignSkip: Alignment.topRight,
        enableOverlayTab: true,
        contents: [
          TargetContent(
            align: ContentAlign.bottom,
            builder: (context, TCMcontroller) {
              return Column(
                children: [
                  Container(
                    decoration: BoxDecoration(
                      color: tours[i]["background"] != null
                          ? hexToColor(tours[i]["background"])
                          : isDarkTheme
                              ? Colors.black
                              : Colors.white,
                      borderRadius: BorderRadius.circular(borderRadius),
                    ),
                    padding: EdgeInsets.all(borderRadius),
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        Text(
                          tours[i]["title"].toString(),
                          style: TextStyle(
                            fontSize: 18,
                            fontWeight: FontWeight.bold,
                            color: tours[i]["textColor"] != null
                                ? hexToColor(tours[i]["textColor"])
                                : isDarkTheme
                                    ? Colors.white
                                    : Colors.black,
                          ),
                        ),
                        // Text(tours[i]["description"].toString()),
                        body.startsWith("http")
                            ? SizedBox(
                                height: 200,
                                width: 200,
                                child: WebViewWidget(
                                    controller: webViewController),
                              )
                            : Text(
                                tours[i]["body"].toString(),
                                style: TextStyle(
                                  color: tours[i]["textColor"] != null
                                      ? hexToColor(tours[i]["textColor"])
                                      : isDarkTheme
                                          ? Colors.white
                                          : Colors.black,
                                ),
                              ),
                      ],
                    ),
                  ),
                  const SizedBox(height: 20),
                  previousAndNextButtons(
                      i, tours.length - 1, tours, config, scrollController),
                ],
              );
            },
          ),
        ],
      ),
    );
    if (body.startsWith("http")) {
      webViewController.loadRequest(Uri.parse(body));
    }
  }
  if (targets.isNotEmpty && tours.isNotEmpty) {
    final firstKey = config.keys[tours[0]["element"].toString()];
    await scrollToTarget(firstKey, scrollController);
  }
  PagePilot.initTutorialCoachMark(targets);
  tutorialCoachMark.show(context: context);
}