movable_ink_plugin 2.2.0 copy "movable_ink_plugin: ^2.2.0" to clipboard
movable_ink_plugin: ^2.2.0 copied to clipboard

MovableInk Plugin for Flutter

example/lib/main.dart

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:movable_ink_plugin/currency.dart';
import 'package:movable_ink_plugin/movable_ink_plugin.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _resolvedURL = '';
  final _movableInkPlugin = MovableInkPlugin();
  StreamSubscription<String>? streamSubscription;

  @override
  void initState() {
    super.initState();

    initMovableInkListener();
  }

  @override
  void dispose() {
    super.dispose();

    streamSubscription?.cancel();
  }

  void initMovableInkListener() async {
    streamSubscription = _movableInkPlugin.start().listen((String data) {
      debugPrint('Resolved Deeplink: $data');

      setState(() {
        _resolvedURL = data;
      });
    }, onError: (error) {
      debugPrint('start error: ${error.toString()}');
    });

    _movableInkPlugin.setMIU("00000000-0000-0000-0000-000000000000");
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Movable SDK Test'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: <Widget>[
              Padding(
                padding: const EdgeInsets.all(12.0),
                child: ElevatedButton(
                  style: ElevatedButton.styleFrom(minimumSize: const Size.fromHeight(60)),
                  onPressed: () {
                    _resolveUrl();
                  },
                  child: const Text('Resolve Url'),
                ),
              ),
              Text('Resolved URL: $_resolvedURL',
                  style: const TextStyle(
                    fontSize: 12.0,
                    fontWeight: FontWeight.bold,
                  )),
              Padding(
                  padding: const EdgeInsets.all(12.0),
                  child: ElevatedButton(
                    style: ElevatedButton.styleFrom(minimumSize: const Size.fromHeight(60)),
                    onPressed: () {
                      _orderCompleted();
                    },
                    child: const Text('Order Completed'),
                  )),
              Padding(
                  padding: const EdgeInsets.all(12.0),
                  child: ElevatedButton(
                    style: ElevatedButton.styleFrom(minimumSize: const Size.fromHeight(60)),
                    onPressed: () {
                      _productViewed();
                    },
                    child: const Text('Product Viewed'),
                  )),
              Padding(
                  padding: const EdgeInsets.all(12.0),
                  child: ElevatedButton(
                    style: ElevatedButton.styleFrom(minimumSize: const Size.fromHeight(60)),
                    onPressed: () {
                      _categoryViewed();
                    },
                    child: const Text('Category Viewed'),
                  )),
              Padding(
                  padding: const EdgeInsets.all(12.0),
                  child: ElevatedButton(
                    style: ElevatedButton.styleFrom(minimumSize: const Size.fromHeight(60)),
                    onPressed: () {
                      _productSearched();
                    },
                    child: const Text('Product Searched'),
                  )),
              Padding(
                  padding: const EdgeInsets.all(12.0),
                  child: ElevatedButton(
                    style: ElevatedButton.styleFrom(minimumSize: const Size.fromHeight(60)),
                    onPressed: () {
                      _productAdded();
                    },
                    child: const Text('Product Added'),
                  )),
              Padding(
                  padding: const EdgeInsets.all(12.0),
                  child: ElevatedButton(
                    style: ElevatedButton.styleFrom(minimumSize: const Size.fromHeight(60)),
                    onPressed: () {
                      _productRemoved();
                    },
                    child: const Text('Product Removed'),
                  )),
              Padding(
                  padding: const EdgeInsets.all(12.0),
                  child: ElevatedButton(
                    style: ElevatedButton.styleFrom(minimumSize: const Size.fromHeight(60)),
                    onPressed: () {
                      _surfaceMessage();
                    },
                    child: const Text('Show In App Message'),
                  )),
            ],
          ),
        ),
      ),
    );
  }

  void _orderCompleted() {
    final Map<String, dynamic> properties = {
      "id": "123",
      "revenue": "300.00",
      "currency": Currency.USD.value,
      "products": [
        {
          "id": "111-6666", 
          "price": "150.00",
          "quantity": 2,
          "meta": {"pages": 496}
        }
      ]
    };
    _movableInkPlugin.orderCompleted(properties);
  }

  void _productSearched() {
    final Map<String, dynamic> properties = {"query": "search_term"};
    _movableInkPlugin.productSearched(properties);
  }

  void _resolveUrl() {
    String urlString =
        "https://www.movable-ink-7158.com/p/cpm/f9e1dde60c339938/c?mi_u=999999&url=https%3A%2F%2Fwww.movable-ink-7158.com%2Fp%2Frpm%2F4ff5ef609123c272%2Furl&url_sig=U4ZfyQRrrBylUa";

    _movableInkPlugin.resolveUrl(urlString).then((value) {
      setState(() {
        _resolvedURL = value ?? '';
      });
    });
  }

  void _surfaceMessage() {
    _movableInkPlugin
        .showInAppMessage("https://www.movable-ink-7158.com/p/rp/bc49c08945403625.html");
  }

  void _categoryViewed() {
    final Map<String, dynamic> properties = {
      "id": "sci-fi",
      "title": "Sci-Fi",
      "url": "https://inkrediblebooks.com/hyperion-dan-simmons",
      "meta": {"pages": 496}
    };
    _movableInkPlugin.categoryViewed(properties);
  }

  void _productAdded() {
    final Map<String, dynamic> properties = {
      "id": "1",
      "title": "Hyperion",
      "price": "15.99",
      "currency": Currency.USD.value,
      "url": "https://inkrediblebooks.com/hyperion-dan-simmons",
      "categories": [
        {"id": "Sci-Fi", "url": "https://inkrediblebooks.com/categories/scifi"},
        {"id": "Fiction", "url": "https://inkrediblebooks.com/categories/fiction"}
      ],
      "meta": {"pages": 496}
    };
    _movableInkPlugin.productAdded(properties);
  }

  void _productRemoved() {
    final Map<String, dynamic> properties = {
      "id": "1",
      "title": "Hyperion",
      "price": "15.99",
      "currency": "USD",
      "url": "https://inkrediblebooks.com/hyperion-dan-simmons",
      "categories": [
        {"id": "Sci-Fi", "url": "https://inkrediblebooks.com/categories/scifi"},
        {"id": "Fiction", "url": "https://inkrediblebooks.com/categories/fiction"}
      ],
      "meta": {"pages": 496}
    };
    _movableInkPlugin.productRemoved(properties);
  }

  void _productViewed() {
    final Map<String, dynamic> properties = {
      "id": "1",
      "title": "Hyperion",
      "price": "15.99",
      "currency": "USD",
      "url": "https://inkrediblebooks.com/hyperion-dan-simmons",
      "categories": [
        {"id": "Sci-Fi", "url": "https://inkrediblebooks.com/categories/scifi"},
        {"id": "Fiction", "url": "https://inkrediblebooks.com/categories/fiction"}
      ],
      "meta": {"pages": 496}
    };
    _movableInkPlugin.productViewed(properties);
  }

  void _logEvent() {
    final Map<String, dynamic> properties = {"id": "122", "segment": "launch"};
    _movableInkPlugin.logEvent("product_removed", properties);
  }
}