thinking_analytics 2.2.2 copy "thinking_analytics: ^2.2.2" to clipboard
thinking_analytics: ^2.2.2 copied to clipboard

Official flutter plugin for tracking events to Thinking Analytics.

example/lib/main.dart

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

import 'package:thinking_analytics/thinking_analytics.dart';

void main() => runApp(new MaterialApp(home: MyApp()));

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

enum USER_OPERATIONS {
  USER_SET,
  USER_SET_ONCE,
  USER_ADD,
  USER_DEL,
  USER_UNSET,
  USER_APPEND,
  USER_UNIQ_APPEND,
}

enum SUPER_PROPERTY_OPERATIONS { SET, CLEAR, UNSET, GET }

enum INSTANCE_OPERATIONS {
  TRACK,
  TRACK_MODEL,
  LOGIN,
  LOGOUT,
  FLUSH,
  INFO,
}

class _MyAppState extends State<MyApp> {
  late ThinkingAnalyticsAPI _ta;
  late ThinkingAnalyticsAPI _ta2;
  late ThinkingAnalyticsAPI _light;

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

  Future<void> initThinkingDataState() async {
    // If the widget was removed from the tree while the asynchronous platform
    // message was in flight, we want to discard the reply rather than calling
    // setState to update our non-existent appearance.
    if (!mounted) return;

    setState(() {});

    ThinkingAnalyticsAPI.enableLog();

    var sKey = TASecretKey();
    sKey.publicKey =
        "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzAKEGsq67Yd03/RF77VKJ/cQ3zfSboK1wzlQfH2E1fr504WCJHHL/UVgjfUGUjMLIN15FNEelp7TXLToqtYlqqMbEXCfSc14ulRatKQioYnJ8EzgUhG0HcRlulni6vxGJHR9iq4weDNyJFRaZuwIQSrUzIaiVq/3hYijxxhhFqQIDAQAB";
    sKey.version = 1;
    sKey.symmetricEncryption = "AES";
    sKey.asymmetricEncryption = "RSA";

    _ta = await ThinkingAnalyticsAPI.getInstance(
        '1b1c1fef65e3482bad5c9d0e6a823356',
        'https://receiver.ta.thinkingdata.cn',
        enableEncrypt: true,
        secretKey: sKey);

    _ta.setDynamicSuperProperties(() {
      return <String, dynamic>{
        'DYNAMIC_DATE': DateTime.now().toUtc(),
        'PROP_INT': 8888
      };
    });

    _ta.setSuperProperties(
        <String, dynamic>{'SUPER_START_TIME': DateTime.now()});

    _ta.enableAutoTrack([
      ThinkingAnalyticsAutoTrackType.APP_START,
      ThinkingAnalyticsAutoTrackType.APP_END,
      ThinkingAnalyticsAutoTrackType.APP_INSTALL,
      ThinkingAnalyticsAutoTrackType.APP_CRASH,
    ]);

    _ta.setAutoTrackProperties([
      ThinkingAnalyticsAutoTrackType.APP_START,
    ], {
      'auto_test': 'stu',
      'auto_arr': [1, 2, 3],
      'auto_obj': {'obj_test': 'xxx'}
    });

    _light = await _ta.createLightInstance();
    _light.identify('light_d_id');

    _ta2 = await ThinkingAnalyticsAPI.getInstance(
      '7a055a4bd7ec423fa5294b4a2c1eff28',
      'https://receiver-ta-dev.thinkingdata.cn',
      timeZone: 'UTC',
      mode: ThinkingAnalyticsMode.DEBUG,
    );
    _ta2.identify('ta2_d_id');
  }

  @override
  Widget build(BuildContext context) {
    List<Widget> buttons = [
      ElevatedButton(
          child: Text('TRACK AN EVENT'), onPressed: () => trackEvent()),
      ElevatedButton(
          child: Text('TRACK DEFAULT_FIRST_CHECK_ID'),
          onPressed: () => trackDefaultFirstCheckID()),
      ElevatedButton(
          child: Text('TRACK FIRST_CHECK_ID'),
          onPressed: () => trackFirstCheckID()),
      ElevatedButton(
          child: Text('TRACK_UPDATE'), onPressed: () => trackUpdate()),
      ElevatedButton(
          child: Text('TRACK_OVERWRITE'), onPressed: () => trackOverwrite()),
      ElevatedButton(
          child: Text('TIME EVENT'),
          onPressed: () => _ta.timeEvent('TEST_EVENT')),
      ElevatedButton(
          child: Text('LOGIN'), onPressed: () => _ta.login('FLUTTER_A_ID')),
      ElevatedButton(child: Text('LOGOUT'), onPressed: () => _ta.logout()),
      ElevatedButton(
          child: Text('SUPER PROPERTIES'),
          onPressed: () => superPropertiesOperations()),
      ElevatedButton(
          child: Text('PRESET PROPERTIES'),
          onPressed: () => presetPropertiesOperations()),
      ElevatedButton(
          child: Text('USER PROPERTIES'), onPressed: () => userOperations()),
      ElevatedButton(
          child: Text('Three-party data access'),
          onPressed: () => enableThirdShare()),
      ElevatedButton(
          child: Text('Stop data tracking'),
          onPressed: () => setTrackStatus(TATrackStatus.PAUSE)),
      ElevatedButton(
          child: Text('Stop data tracing to clear the cache'),
          onPressed: () => setTrackStatus(TATrackStatus.STOP)),
      ElevatedButton(
          child: Text('Stopping Data Reporting'),
          onPressed: () => setTrackStatus(TATrackStatus.SAVE_ONLY)),
      ElevatedButton(
          child: Text('Restore the data reporting status'),
          onPressed: () => setTrackStatus(TATrackStatus.NORMAL)),
      ElevatedButton(child: Text('FLUSH'), onPressed: () => flush()),
      ElevatedButton(
          child: Text('SHOW SDK INFO'), onPressed: () => getSDKInfo(_ta)),
      ElevatedButton(
          child: Text('LIGHT INSTANCE'),
          onPressed: () => instanceOperations(_light, 'light')),
      ElevatedButton(
          child: Text('ANOTHER INSTANCE'),
          onPressed: () => instanceOperations(_ta2, 'another')),
    ];

    return MaterialApp(
      theme: ThemeData(
          //buttonTheme: ButtonThemeData(minWidth: double.infinity),
          ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
            child: new CustomScrollView(shrinkWrap: true, slivers: <Widget>[
          new SliverPadding(
            padding: const EdgeInsets.all(20.0),
            sliver: new SliverList(
              delegate: new SliverChildListDelegate(
                buttons,
              ),
            ),
          ),
        ])),
      ),
    );
  }

  Future<void> getSDKInfo(ThinkingAnalyticsAPI instance) async {
    String? distinctId = await instance.getDistinctId();
    String? deviceId = await instance.getDeviceId();

    showDialog(
        context: context,
        builder: (context) {
          return new SimpleDialog(
            title: new Text("SDK Info"),
            children: <Widget>[
              new SimpleDialogOption(
                child: new Text("Distinct ID: " + distinctId!),
              ),
              new SimpleDialogOption(
                child: new Text("Device ID: " + deviceId!),
              ),
            ],
          );
        });
  }

  Future<void> userOperations() async {
    switch (await showDialog<USER_OPERATIONS>(
        context: context,
        builder: (BuildContext context) {
          return SimpleDialog(
            title: const Text('Select assignment'),
            children: <Widget>[
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, USER_OPERATIONS.USER_SET);
                },
                child: const Text('USER SET'),
              ),
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, USER_OPERATIONS.USER_SET_ONCE);
                },
                child: const Text('USER SET ONCE'),
              ),
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, USER_OPERATIONS.USER_APPEND);
                },
                child: const Text('USER APPEND'),
              ),
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, USER_OPERATIONS.USER_UNIQ_APPEND);
                },
                child: const Text('USER UNIQ APPEND'),
              ),
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, USER_OPERATIONS.USER_ADD);
                },
                child: const Text('USER ADD'),
              ),
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, USER_OPERATIONS.USER_UNSET);
                },
                child: const Text('USER UNSET'),
              ),
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, USER_OPERATIONS.USER_DEL);
                },
                child: const Text('USER DEL'),
              ),
            ],
          );
        })) {
      case USER_OPERATIONS.USER_SET:
        _ta.userSet(<String, dynamic>{
          'USER_INT': 1,
          'USER_DOUBLE': 50.12,
          'USER_LIST': ['apple', 'ball', 'cat', 1, DateTime.now().toUtc()],
          'USER_BOOL': true,
          'USER_STRING': 'a user value',
          'USER_DATE': DateTime.now(),
        });
        break;
      case USER_OPERATIONS.USER_SET_ONCE:
        _ta.userSetOnce(<String, dynamic>{
          'USER_INT': 2,
          'USER_DOUBLE': 10.12,
        });
        break;
      case USER_OPERATIONS.USER_APPEND:
        _ta.userAppend(<String, List>{
          'USER_LIST': [DateTime.now()],
        });
        break;
      case USER_OPERATIONS.USER_UNIQ_APPEND:
        _ta.userUniqAppend(<String, List>{
          'USER_LIST1': [DateTime.now()],
        });
        break;
      case USER_OPERATIONS.USER_ADD:
        _ta.userAdd(<String, num>{
          'USER_INT': 2,
          'USER_DOUBLE': 10.1,
        });
        break;
      case USER_OPERATIONS.USER_UNSET:
        _ta.userUnset('USER_INT');
        break;
      case USER_OPERATIONS.USER_DEL:
        _ta.userDelete();
        break;
      default:
        break;
    }
  }

  Future<void> superPropertiesOperations() async {
    switch (await showDialog<SUPER_PROPERTY_OPERATIONS>(
        context: context,
        builder: (BuildContext context) {
          return SimpleDialog(
            title: const Text('SUPER PROPERTIES'),
            children: <Widget>[
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, SUPER_PROPERTY_OPERATIONS.SET);
                },
                child: const Text('SET SUPER PROPERTIES'),
              ),
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, SUPER_PROPERTY_OPERATIONS.CLEAR);
                },
                child: const Text('CLEAR SUPER PROPERTIES'),
              ),
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, SUPER_PROPERTY_OPERATIONS.UNSET);
                },
                child: const Text('UNSET A SUPER PROPERTY'),
              ),
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, SUPER_PROPERTY_OPERATIONS.GET);
                },
                child: const Text('GET SUPER PROPERTIES'),
              ),
            ],
          );
        })) {
      case SUPER_PROPERTY_OPERATIONS.SET:
        Map<String, dynamic> superProperties = {
          'SUPER_STRING': 'super string value',
          'SUPER_INT': 1234,
          'SUPER_DOUBLE': 66.88,
          'SUPER_DATE': DateTime.now(),
          'SUPER_BOOL': true,
          'SUPER_LIST': [1234, 'hello', DateTime.now().toUtc()]
        };

        _ta.setSuperProperties(superProperties);
        break;
      case SUPER_PROPERTY_OPERATIONS.CLEAR:
        _ta.clearSuperProperties();
        break;
      case SUPER_PROPERTY_OPERATIONS.UNSET:
        _ta.unsetSuperProperty('SUPER_LIST');
        break;
      case SUPER_PROPERTY_OPERATIONS.GET:
        var superProperties = await _ta.getSuperProperties();
        print("super properties: " + superProperties.toString());
        break;
      default:
        break;
    }
  }

  Future<void> presetPropertiesOperations() async {
    TDPresetProperties presetProperties = await _ta.getPresetProperties();
    String deviceId = presetProperties.deviceId!;
    print("preset properties: device_id = " + deviceId);
    Map<String, dynamic>? eventPresetProperties =
        presetProperties.toEventPresetProperties();
    print("preset properties: " + eventPresetProperties.toString());
  }

  void trackEvent() {
    _ta.track('TEST_EVENT', properties: <String, dynamic>{
      'PROP_INT': 5678,
      'PROP_DOUBLE': 12.3,
      'PROP_DATE': DateTime.now().toUtc(),
      'PROP_LIST': ['apple', 'ball', 1234],
      'PROP_BOOL': false,
      'PROP_STRING': 'flutter test',
    });
  }

  void trackDefaultFirstCheckID() {
    var properties = {
      'PROP_INT': 5678,
      'PROP_DOUBLE': 12.3,
      'PROP_DATE': DateTime.now().toUtc(),
      'PROP_LIST': ['apple', 'ball', 1234],
      'PROP_BOOL': false,
      'PROP_STRING': 'flutter test',
    };
    var firstModel =
        TrackFirstEventModel('EventName_Flutter_FirstCheckID', '', properties);
    firstModel.dateTime = DateTime.now().toUtc();
    firstModel.timeZone = 'UTC';
    _ta.trackEventModel(firstModel);
  }

  void trackFirstCheckID() {
    var properties = {
      'PROP_INT': 5678,
      'PROP_DOUBLE': 12.3,
      'PROP_DATE': DateTime.now().toUtc(),
      'PROP_LIST': ['apple', 'ball', 1234],
      'PROP_BOOL': false,
      'PROP_STRING': 'flutter test',
    };
    var firstModel = TrackFirstEventModel(
        'EventName_Flutter_FirstCheckID', 'FlutterFirstCheckID', properties);
    firstModel.dateTime = DateTime.now().toUtc();
    firstModel.timeZone = 'UTC';
    _ta.trackEventModel(firstModel);
  }

  void trackUpdate() {
    var properties = {
      'PROP_INT': 5678,
      'PROP_DOUBLE': 12.3,
      'PROP_DATE': DateTime.now().toUtc(),
      'PROP_LIST': ['apple', 'ball', 1234],
      'PROP_BOOL': false,
      'PROP_STRING': 'flutter test',
    };
    var updateModel = TrackUpdateEventModel(
        'EventName_Flutter_FirstCheckID', 'FlutterEditEventID', properties);
    updateModel.dateTime = DateTime.now().toUtc();
    updateModel.timeZone = 'UTC';
    _ta.trackEventModel(updateModel);
  }

  void trackOverwrite() {
    var properties = {
      'PROP_INT': 5678,
      'PROP_DOUBLE': 12.3,
      'PROP_DATE': DateTime.now().toUtc(),
      'PROP_LIST': ['apple', 'ball', 1234],
      'PROP_BOOL': false,
      'PROP_STRING': 'flutter test',
      'PROP_EDIT_KEY': 'PROP_EDIT_VALUE_UPDATE',
      'PROP_EDIT_KEY2': 'PROP_EDIT_VALUE_UPDATE2',
    };
    var overwriteModel = TrackOverwriteEventModel(
        'EventName_Flutter_FirstCheckID', 'FlutterEditEventID', properties);
    overwriteModel.dateTime = DateTime.now().toUtc();
    overwriteModel.timeZone = 'UTC';
    _ta.trackEventModel(overwriteModel);
  }

  void enableThirdShare() {
    _ta.enableThirdPartySharing([
      TAThirdPartyShareType.TA_APPS_FLYER,
      TAThirdPartyShareType.TA_ADJUST,
      TAThirdPartyShareType.TA_BRANCH,
      TAThirdPartyShareType.TA_IRON_SOURCE,
      TAThirdPartyShareType.TA_TOP_ON,
      TAThirdPartyShareType.TA_TRACKING,
      TAThirdPartyShareType.TA_TRAD_PLUS
    ]);
    // _ta.enableThirdPartySharing(
    //     TAThirdPartyShareType.TA_TRAD_PLUS, {'name': 'jack'});
  }

  void setTrackStatus(TATrackStatus status) {
    _ta.setTrackStatus(status);
  }

  void flush() {
    _ta.flush();
  }

  Future<void> instanceOperations(
      ThinkingAnalyticsAPI instance, String prefix) async {
    switch (await showDialog<INSTANCE_OPERATIONS>(
        context: context,
        builder: (BuildContext context) {
          return SimpleDialog(
            title: Text('INSTANCE: ' + prefix),
            children: <Widget>[
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, INSTANCE_OPERATIONS.TRACK);
                },
                child: const Text('TRACK AN EVENT'),
              ),
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, INSTANCE_OPERATIONS.TRACK_MODEL);
                },
                child: const Text('TRACK AN EVENT WITH MODEL'),
              ),
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, INSTANCE_OPERATIONS.LOGIN);
                },
                child: const Text('LOGIN'),
              ),
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, INSTANCE_OPERATIONS.LOGOUT);
                },
                child: const Text('LOGOUT'),
              ),
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, INSTANCE_OPERATIONS.FLUSH);
                },
                child: const Text('FLUSH'),
              ),
              SimpleDialogOption(
                onPressed: () {
                  Navigator.pop(context, INSTANCE_OPERATIONS.INFO);
                },
                child: const Text('SHOW SDK INFO'),
              ),
            ],
          );
        })) {
      case INSTANCE_OPERATIONS.TRACK:
        instance.track(prefix + '_TEST');
        break;
      case INSTANCE_OPERATIONS.LOGIN:
        instance.login(prefix + '_aid');
        break;
      case INSTANCE_OPERATIONS.LOGOUT:
        instance.logout();
        break;
      case INSTANCE_OPERATIONS.FLUSH:
        instance.flush();
        break;
      case INSTANCE_OPERATIONS.INFO:
        getSDKInfo(instance);
        break;
      default:
        break;
    }
  }
}
1
likes
125
pub points
83%
popularity

Publisher

verified publisherthinkingdata.cn

Official flutter plugin for tracking events to Thinking Analytics.

Homepage
Repository (GitHub)
View/report issues

Documentation

API reference

License

Apache-2.0 (LICENSE)

Dependencies

flutter

More

Packages that depend on thinking_analytics