emarsys_sdk 2.3.2 copy "emarsys_sdk: ^2.3.2" to clipboard
emarsys_sdk: ^2.3.2 copied to clipboard

The Flutter plug-in for SAP Emarsys Customer Engagement is the official plug-in to help integrate Emarsys into your Flutter application.

example/lib/main.dart

import 'dart:io';

import 'package:emarsys_sdk/emarsys_sdk.dart';
import 'package:emarsys_sdk_example/inbox_messages.dart';
import 'package:emarsys_sdk_example/predict.dart';

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter/services.dart';
import 'dart:convert';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  SharedPreferences prefs = await SharedPreferences.getInstance();
  Emarsys.setup(EmarsysConfig(
      applicationCode: prefs.getString("appcode") ?? 'EMS74-EFB68',
      merchantId: "1428C8EE286EC34B",
      androidVerboseConsoleLoggingEnabled: true,
      androidSharedPackageNames: ["com.emarsys.sample"],
      androidSharedSecret: "secret",
      iOSEnabledConsoleLogLevels: [
        ConsoleLogLevels.BASIC,
        ConsoleLogLevels.DEBUG,
        ConsoleLogLevels.TRACE,
        ConsoleLogLevels.INFO,
        ConsoleLogLevels.WARN,
        ConsoleLogLevels.ERROR
      ]));

  runApp(MyApp());

  Emarsys.push.registerAndroidNotificationChannels([
    NotificationChannel(
        id: "ems_sample_news",
        name: "News",
        description: "News and updates go into this channel",
        importance: NotificationChannel.IMPORTANCE_HIGH),
    NotificationChannel(
        id: "ems_sample_messages",
        name: "Messages",
        description: "Important messages go into this channel",
        importance: NotificationChannel.IMPORTANCE_HIGH),
  ]);
}

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

class _MyAppState extends State<MyApp> {
  late TextEditingController _contactFieldIdController;
  late TextEditingController _contactFieldValueController;
  late TextEditingController _appCodeFieldController;
  late TextEditingController _customEventNameFieldController;
  late TextEditingController _customEventPayloadFieldController;
  final _messengerKey = GlobalKey<ScaffoldMessengerState>();
  String hardwareId = "-";
  int? contactFieldId;
  String? applicationCode;
  String? languageCode;
  String? merchantId;
  String? notificationSettings;
  String? sdkVersion;
  bool pushEnabled = true;
  late SharedPreferences prefs;
  String? contactFieldValue;
  String? customEventName;
  String? customEventPayload;
  int _currentIndex = 0;
  bool showInlineInApp = true;

  @override
  void initState() {
    super.initState();
    _contactFieldValueController = TextEditingController();
    _appCodeFieldController = TextEditingController();
    _contactFieldIdController = TextEditingController();
    _customEventNameFieldController = TextEditingController();
    _customEventPayloadFieldController = TextEditingController();

    Emarsys.push.pushEventStream.listen((event) {
      _messengerKey.currentState!.showSnackBar(
          SnackBar(content: Text("${event.name} - ${event.payload}")));
      print(event.name);
    });
    Emarsys.push.silentPushEventStream.listen((event) {
      _messengerKey.currentState!.showSnackBar(
          SnackBar(content: Text("${event.name} - ${event.payload}")));
      print(event.name);
    });
    Emarsys.geofence.geofenceEventStream.listen((event) {
      _messengerKey.currentState!.showSnackBar(
          SnackBar(content: Text("${event.name} - ${event.payload}")));
      print(event.name);
    });
    Emarsys.inApp.inAppEventStream.listen((event) {
      _messengerKey.currentState!.showSnackBar(
          SnackBar(content: Text("${event.name} - ${event.payload}")));
      print(event.name);
    });

    WidgetsBinding.instance
        .addPostFrameCallback((_) => afterFirstLayout(context));
  }

  void afterFirstLayout(BuildContext context) async {
    String hardwareIdFromNative = await Emarsys.config.hardwareId();
    String? applicationCodeFromNative = await Emarsys.config.applicationCode();
    String? languageCodeFromNative = await Emarsys.config.languageCode();
    String? merchantIdFromNative = await Emarsys.config.merchantId();
    int? contactFieldIdFromNative = await Emarsys.config.contactFieldId();

    NotificationSettings notificationSettingsFromNative =
        await Emarsys.config.notificationSettings();

    String sdkVersionFromNative = await Emarsys.config.sdkVersion();
    _contactFieldValueController.text = contactFieldValue ?? "";
    _appCodeFieldController.text = applicationCodeFromNative ?? "";
    _contactFieldIdController.text =
        contactFieldId == null ? contactFieldId.toString() : "";
    setState(() {
      hardwareId = hardwareIdFromNative;
      contactFieldId = contactFieldIdFromNative;
      applicationCode = applicationCodeFromNative;
      languageCode = languageCodeFromNative;
      merchantId = merchantIdFromNative;
      notificationSettings = notificationSettingsFromNative.toString();
      sdkVersion = sdkVersionFromNative;
    });
    try {
      prefs = await SharedPreferences.getInstance();
      contactFieldValue = prefs.getString("loggedInUser");
    } catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      scaffoldMessengerKey: _messengerKey,
      home: Scaffold(
          appBar: AppBar(
            title: const Text('Emarsys SDK Example'),
          ),
          bottomNavigationBar: BottomNavigationBar(
            currentIndex: _currentIndex,
            onTap: (newIndex) {
              setState(() {
                _currentIndex = newIndex;
              });
            },
            items: [
              BottomNavigationBarItem(
                  backgroundColor: Colors.black87,
                  icon: Icon(Icons.home),
                  label: "Home"),
              BottomNavigationBarItem(
                  backgroundColor: Colors.black87,
                  icon: Icon(Icons.track_changes),
                  label: "Tracking"),
              BottomNavigationBarItem(
                  backgroundColor: Colors.black87,
                  icon: Icon(Icons.message),
                  label: "Inbox"),
              BottomNavigationBarItem(
                  backgroundColor: Colors.black87,
                  icon: Icon(Icons.bug_report),
                  label: "Predict"),
            ],
          ),
          body: body(_currentIndex)),
    );
  }

  Widget body(int index) {
    return [home(), tracking(), InboxMessages(), PredictView()][index];
  }

  Widget home() {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: SingleChildScrollView(
        child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
          SizedBox(height: 8),
          TextField(
            controller: _appCodeFieldController,
            decoration: InputDecoration(
                border: OutlineInputBorder(), labelText: "applicationCode"),
          ),
          ElevatedButton(
            onPressed: () async {
              if (_appCodeFieldController.text.isNotEmpty) {
                await Emarsys.config
                    .changeApplicationCode(_appCodeFieldController.text);
                prefs.setString("appcode", _appCodeFieldController.text);
                setState(() {
                  applicationCode = _appCodeFieldController.text;
                  contactFieldValue = null;
                });
              } else {
                _messengerKey.currentState!.showSnackBar(
                    SnackBar(content: Text('Fill the textField')));
              }
            },
            child: Text("changeAppCode"),
          ),
          SizedBox(height: 8),
          TextField(
            controller: _contactFieldIdController,
            keyboardType: TextInputType.number,
            inputFormatters: [FilteringTextInputFormatter.digitsOnly],
            decoration: InputDecoration(
                border: OutlineInputBorder(), labelText: "contactFieldId"),
          ),
          SizedBox(height: 8),
          TextField(
            controller: _contactFieldValueController,
            decoration: InputDecoration(
                border: OutlineInputBorder(), labelText: "contactFieldValue"),
          ),
          if (contactFieldValue == null)
            ElevatedButton(
              onPressed: () {
                if (_contactFieldIdController.text.isNotEmpty &&
                    _contactFieldValueController.text.isNotEmpty) {
                  Emarsys.setContact(int.parse(_contactFieldIdController.text),
                      _contactFieldValueController.text);
                  setState(() {
                    contactFieldId = int.parse(_contactFieldIdController.text);
                    prefs.setInt("contactFieldId",
                        int.parse(_contactFieldIdController.text));
                    contactFieldValue = _contactFieldValueController.text;
                    prefs.setString(
                        "loggedInUser", _contactFieldValueController.text);
                  });
                } else {
                  _messengerKey.currentState!.showSnackBar(
                      SnackBar(content: Text('Something went wrong...')));
                }
              },
              child: Text("Login"),
            )
          else
            ElevatedButton(
              onPressed: () {
                _contactFieldValueController.text = "";
                Emarsys.clearContact();
                setState(() {
                  prefs.remove("loggedInUser");
                  contactFieldValue = null;
                });
              },
              child: Text("Logout"),
            ),
        ]),
      ),
    );
  }

  Widget tracking() {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: SingleChildScrollView(
        child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
          Center(
            child: Card(
              child: Padding(
                padding: EdgeInsets.all(8),
                child: Table(
                  children: [
                    TableRow(
                      children: [Text("hardwareId"), Text(hardwareId)],
                    ),
                    TableRow(
                      children: [
                        Text("ApplicationCode"),
                        Text(applicationCode ?? "-")
                      ],
                    ),
                    TableRow(
                      children: [Text("MerchantId"), Text(merchantId ?? "-")],
                    ),
                    TableRow(
                      children: [
                        Text("ContactFieldId"),
                        Text(contactFieldId.toString())
                      ],
                    ),
                    TableRow(
                      children: [
                        Text("languageCode"),
                        Text(languageCode ?? "-")
                      ],
                    ),
                    TableRow(
                      children: [Text("sdkVersion"), Text(sdkVersion ?? "-")],
                    )
                  ],
                ),
              ),
            ),
          ),
          Row(
            children: [
              Text("Push sending enabled"),
              Switch(
                  value: pushEnabled,
                  onChanged: (newValue) {
                    setState(() {
                      pushEnabled = newValue;
                    });
                    Emarsys.push.pushSendingEnabled(pushEnabled);
                  })
            ],
          ),
          TextField(
            controller: _customEventNameFieldController,
            decoration: InputDecoration(
                border: OutlineInputBorder(), labelText: "customEvent name"),
          ),
          TextField(
            maxLines: 3,
            controller: _customEventPayloadFieldController,
            decoration: InputDecoration(
                border: OutlineInputBorder(), labelText: "customEvent payload"),
          ),
          ElevatedButton(
            onPressed: () async {
              if (_customEventNameFieldController.text.isNotEmpty) {
                await Emarsys.trackCustomEvent(
                    _customEventNameFieldController.text,
                    convertTextToMap(_customEventPayloadFieldController.text));
                setState(() {
                  customEventName = _customEventNameFieldController.text;
                  customEventPayload = _customEventPayloadFieldController.text;
                });
              } else {
                _messengerKey.currentState!.showSnackBar(
                    SnackBar(content: Text('Fill customEventName')));
              }
            },
            child: Text("customEvent"),
          ),
          Divider(),
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: Center(
                child: Text("Geofence",
                    style: TextStyle(fontWeight: FontWeight.w500))),
          ),
          Row(
            children: [
              ElevatedButton(
                  onPressed: () async {
                    if (Platform.isIOS) {
                      await Emarsys.geofence.iOSRequestAlwaysAuthorization();
                    } else {
                      await Permission.location.request();
                      await Permission.locationAlways.request();
                      await Permission.locationWhenInUse.request();
                    }
                    Emarsys.geofence.enable();
                  },
                  child: Text("Enable Geofence")),
              ElevatedButton(
                  onPressed: () async {
                    Emarsys.geofence.disable();
                  },
                  child: Text("Disable Geofence")),
            ],
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                  onPressed: () async {
                    print(await Emarsys.geofence.registeredGeofences());
                  },
                  child: Text("Log registered Geofences")),
            ],
          ),
          if (showInlineInApp)
            Card(
              child: SizedBox(
                height: 100,
                child: InlineInAppView(
                  viewId: "ia",
                  onAppEvent: (event) {
                    print("eventName: ${event.name}, payload:${event.payload}");
                  },
                  onCompleted: () {
                    print("in-app view has been loaded.");
                  },
                  onClose: () {
                    setState(() {
                      showInlineInApp = false;
                    });
                  },
                ),
              ),
            ),
        ]),
      ),
    );
  }
}

Map<String, String>? convertTextToMap(String? text) {
  Map<String, String>? result;
  if (text != null && text.isNotEmpty) {
    result = json.decode(text);
  }
  return result;
}
4
likes
130
pub points
85%
popularity

Publisher

verified publisheremarsys.com

The Flutter plug-in for SAP Emarsys Customer Engagement is the official plug-in to help integrate Emarsys into your Flutter application.

Repository (GitHub)
View/report issues

Documentation

API reference

License

MPL-2.0 (LICENSE)

Dependencies

equatable, flutter, shared_preferences

More

Packages that depend on emarsys_sdk