se_flutter_sdk 0.0.5
se_flutter_sdk: ^0.0.5 copied to clipboard
flutter sdk for solar-engine!
example/lib/main.dart
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:se_flutter_sdk/solar_engine_core/solar_engine.dart';
import 'package:se_flutter_sdk/solar_engine_core/solar_engine_config.dart';
import 'package:se_flutter_sdk/solar_engine_core/solar_engine_event_data.dart';
import 'package:se_flutter_sdk/solar_engine_remote_config/remote_config.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(title: 'SolarEngine Demo'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
typedef ClickCallbackString = void Function(String result);
typedef ClickCallbackString2 = void Function(String result1, String result2);
typedef ClickCallback = void Function();
class SETextButtonItem extends StatelessWidget {
final String title;
final String desc;
final ClickCallbackString tapAction;
var _titleTxt = new TextEditingController();
SETextButtonItem(this.title, this.desc, this.tapAction);
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.all(12),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
TextField(
controller: _titleTxt, //把 TextEditingController 对象应用到 TextField 上
decoration: InputDecoration(
// border: OutlineInputBorder(),
filled: true,
fillColor: Colors.grey[200],
// padding: MaterialStateProperty.all(EdgeInsets.only(left: 20,right: 20)),
hintText: desc,
),
),
SizedBox(height: 8),
// Expanded(child: Container(
// width: 500,
// decoration: BoxDecoration(color: Colors.red),
// )),
TextButton(
onPressed: () {
tapAction!(_titleTxt.text);
},
autofocus: true,
child: Text(
title,
style: TextStyle(fontSize: 18.0),
),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.resolveWith((states) {
return Colors.blue[200];
}),
// width: 500,
padding: MaterialStateProperty.all(
EdgeInsets.only(left: 50, right: 50)),
),
),
],
),
);
}
}
class SEText2ButtonItem extends StatelessWidget {
final String title;
final String desc1;
final String desc2;
final ClickCallbackString2 tapAction;
var _titleTxt1 = new TextEditingController();
var _titleTxt2 = new TextEditingController();
SEText2ButtonItem(this.title, this.desc1, this.desc2, this.tapAction);
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.all(12),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Expanded(
child: TextField(
controller: _titleTxt1,
//把 TextEditingController 对象应用到 TextField 上
decoration: InputDecoration(
// border: OutlineInputBorder(),
filled: true,
fillColor: Colors.grey[200],
// padding: MaterialStateProperty.all(EdgeInsets.only(left: 20,right: 20)),
hintText: desc1,
),
),
),
SizedBox(width: 8),
Expanded(
child: TextField(
controller: _titleTxt2,
//把 TextEditingController 对象应用到 TextField 上
decoration: InputDecoration(
// border: OutlineInputBorder(),
filled: true,
fillColor: Colors.grey[200],
// padding: MaterialStateProperty.all(EdgeInsets.only(left: 20,right: 20)),
hintText: desc2,
),
),
),
],
),
SizedBox(height: 8),
// Expanded(child: Container(
// width: 500,
// decoration: BoxDecoration(color: Colors.red),
// )),
TextButton(
onPressed: () {
tapAction!(_titleTxt1.text, _titleTxt2.text);
},
autofocus: true,
child: Text(
title,
style: TextStyle(fontSize: 18.0),
),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.resolveWith((states) {
return Colors.blue[200];
}),
// width: 500,
padding: MaterialStateProperty.all(
EdgeInsets.only(left: 50, right: 50)),
),
),
],
),
);
}
}
class SEButtonItem extends StatelessWidget {
final String title;
final ClickCallback tapAction;
SEButtonItem(this.title, this.tapAction);
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.all(12),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
TextButton(
onPressed: () {
tapAction!();
},
autofocus: true,
child: Text(
title,
style: TextStyle(fontSize: 18.0),
),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.resolveWith((states) {
return Colors.blue[200];
}),
// width: 500,
padding: MaterialStateProperty.all(
EdgeInsets.only(left: 50, right: 50)),
),
),
],
),
);
}
}
class _MyHomePageState extends State<MyHomePage> {
void toast(String text) {
final snackBar = SnackBar(content: Text(text));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
late final String timerEventStr;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Center(
child: Padding(
padding: EdgeInsets.only(left: 0, right: 0),
child: CustomScrollView(
shrinkWrap: true,
slivers: <Widget>[
SliverPadding(
padding: const EdgeInsets.all(0),
sliver: SliverList(
delegate: SliverChildListDelegate(
<Widget>[
SEButtonItem("Init SDK", () {
// SolarEngineSDK sdk = SolarEngineSDK();
// sdk.initSDK();
String appkey = "898b33180e819174";
String userId = "5c5a2f0fd35d9296";
SolarEngineConfig config = SolarEngineConfig();
config.logEnabled = true;
config.disableRecordLog = true;
SERemoteConfigData rcConfig = SERemoteConfigData();
rcConfig.enable = true;
rcConfig.logEnabled = true;
// rcConfig.customIDProperties = {"k1":"v1"};
// rcConfig.customIDUserProperties = {"k2_user":"v1"};
// rcConfig.customIDEventProperties = {"k3_event":"v1"};
rcConfig.customIDProperties = {
"key": "customID",
"value": "androidID"
};
rcConfig.customIDEventProperties = {
"key": "customEventID",
"value": "_appStart"
};
rcConfig.customIDUserProperties = {
"key": "customUserID",
"value": "Topic"
};
config.remoteConfigData = rcConfig;
config.onAttributionSuccess = (data) {
print("onAttributionSuccess----");
print(data);
toast(data!);
};
config.onAttributionFail = (code) {
print("onAttributionFail----");
print(code);
toast("onAttributionFail" + code.toString());
};
SolarEngine.initialize(appkey, userId, config);
}),
SETextButtonItem("asyncFetchRemoteConfig", "key", (key) {
SERemoteConfig().asyncFetchRemoteConfig(key, (result) {
print("在线参数回调-----");
print(result);
toast("result=" + result!);
});
}),
SETextButtonItem("setRemoteDefaultConfig", "properties",
(properties) async {
List<dynamic> data = [
{"name": "key1", "type": 2, "value": 1},
{"name": "key2", "type": 2, "value": 0}
];
SERemoteConfig().setRemoteDefaultConfig(data);
}),
SETextButtonItem(
"setRemoteConfigUserProperties", "properties",
(properties) {
if (properties.isNotEmpty) {
Map<String, dynamic> userProperties =
json.decode(properties);
SERemoteConfig()
.setRemoteConfigUserProperties(userProperties);
return;
}
Map<String, dynamic> userProperties = {};
userProperties['name'] = 'liming';
userProperties['age'] = "20";
SERemoteConfig()
.setRemoteConfigUserProperties(userProperties);
}),
SETextButtonItem(
"setRemoteConfigEventProperties", "properties",
(properties) {
if (properties.isNotEmpty) {
Map<String, dynamic> eventProperties =
json.decode(properties);
SERemoteConfig()
.setRemoteConfigEventProperties(eventProperties);
return;
}
Map<String, dynamic> eventProperties = {};
eventProperties['event'] = 'end';
eventProperties['pro'] = "max";
SERemoteConfig()
.setRemoteConfigEventProperties(eventProperties);
}),
SETextButtonItem("fastFetchRemoteConfig", "key",
(key) async {
String? result =
await SERemoteConfig().fastFetchRemoteConfig(key);
toast("result=${result!}");
}),
SEText2ButtonItem(
"setPresetEventProperties",
"PresetEventType",
"properties", (presetEventType, propertiesString) {
if (presetEventType.isNotEmpty &&
propertiesString.isNotEmpty) {
Map<String, dynamic> customProperties =
json.decode(propertiesString);
if (presetEventType == '0') {
SolarEngine.setPresetEventProperties(
PresetEventType.AppInstall, customProperties);
} else if (presetEventType == '1') {
SolarEngine.setPresetEventProperties(
PresetEventType.AppStart, customProperties);
} else if (presetEventType == '2') {
SolarEngine.setPresetEventProperties(
PresetEventType.AppEnd, customProperties);
} else {
SolarEngine.setPresetEventProperties(
PresetEventType.All, customProperties);
}
return;
}
Map<String, dynamic> customProperties = {};
customProperties['kind'] = 'setPresetEventProperties';
customProperties['name'] = "Jim";
if (presetEventType == '0') {
SolarEngine.setPresetEventProperties(
PresetEventType.AppInstall, customProperties);
} else if (presetEventType == '1') {
SolarEngine.setPresetEventProperties(
PresetEventType.AppStart, customProperties);
} else if (presetEventType == '2') {
SolarEngine.setPresetEventProperties(
PresetEventType.AppEnd, customProperties);
} else {
SolarEngine.setPresetEventProperties(
PresetEventType.All, customProperties);
}
}),
SETextButtonItem("setVisitorID", "visitId", (result) {
SolarEngine.setVisitorID(result);
}),
SEButtonItem("getVisitorID", () async {
var visitorID = await SolarEngine.getVisitorID();
toast("visitorID=${visitorID!}");
}),
SETextButtonItem("setAccountID", "accountID", (result) {
SolarEngine.login(result);
}),
SEButtonItem("getAccountID", () async {
var accountID = await SolarEngine.getAccountID();
toast("accountID=${accountID!}");
}),
SEButtonItem("logout", () {
SolarEngine.logout();
}),
SEButtonItem("getDistinctId", () async {
var distinctId = await SolarEngine.getDistinctId();
toast("distinctId=${distinctId!}");
}),
SEButtonItem("getAttribution", () async {
var getAttribution = await SolarEngine.getAttribution();
toast("getAttribution=${getAttribution!}");
}),
SETextButtonItem("setChannel", "setChannel", (result) {
SolarEngine.setChannel(result);
}),
SETextButtonItem("setGDPRArea", "setGDPRArea", (result) {
bool setGDPRArea = bool.parse(result);
SolarEngine.setGDPRArea(setGDPRArea);
}),
SETextButtonItem("setSuperProperties", "properties",
(propertiesString) {
if (propertiesString.isNotEmpty) {
Map<String, dynamic> properties =
json.decode(propertiesString);
SolarEngine.setSuperProperties(properties);
return;
}
Map<String, dynamic> properties = {};
properties['key1'] = 'String';
properties['key2'] = 2;
properties['key3'] = false;
properties['key4'] = 2.0;
properties['key5'] = 202309110902;
properties['key6'] = 2018.99;
Map<String, dynamic> jsonObject = {
"name": "仙尊",
"age": 30,
"address": {"street": "奥林匹克公园", "city": "beijing"}
};
properties['key7'] = jsonObject;
List<dynamic> jsonArray = ["小丑侧斩", "小丑换位", "英雄碎片"];
properties['key8'] = jsonArray;
SolarEngine.setSuperProperties(properties);
}),
SETextButtonItem("unsetSuperProperty", "key", (key) {
SolarEngine.unsetSuperProperty(key);
}),
SEButtonItem("clearSuperProperties", () {
SolarEngine.clearSuperProperties();
}),
SEText2ButtonItem(
"trackCustomEvent", "eventName", "properties",
(eventName, propertiesString) {
if (propertiesString.isNotEmpty &&
eventName.isNotEmpty) {
SECustomEventData event = SECustomEventData();
event.customEventName = eventName;
Map<String, dynamic> properties =
json.decode(propertiesString);
event.customProperties = properties;
SolarEngine.trackCustomEvent(event);
return;
}
SECustomEventData customEventData = SECustomEventData();
customEventData.customEventName = "OpenAPP";
Map<String, dynamic> customProperties = {};
customProperties['time'] = '2020-10-10';
customProperties['data'] = "hello word!";
customEventData.customProperties = customProperties;
SolarEngine.trackCustomEvent(customEventData);
}),
SETextButtonItem("trackIAP", "properties", (pString) {
if (pString.isNotEmpty) {
Map<String, dynamic> properties =
json.decode(pString);
SEAppPurchaseData purchase = SEAppPurchaseData();
purchase.orderId = properties["orderId"];
purchase.payAmount = properties["payAmount"];
purchase.currencyType = properties["currencyType"];
purchase.payType = properties["payType"];
purchase.productId = properties["productId"];
purchase.productName = properties["productName"];
purchase.productNum = properties["productNum"];
purchase.payStatus = properties["payStatus"];
purchase.failReason = properties["failReason"];
purchase.customProperties =
properties["customProperties"];
SolarEngine.trackAppPurchase(purchase);
return;
}
SEAppPurchaseData appPurchaseData = SEAppPurchaseData();
appPurchaseData.currencyType = "CN";
appPurchaseData.failReason = "支付失败";
appPurchaseData.orderId = "1123";
appPurchaseData.payAmount = 90.99;
appPurchaseData.payStatus = 1;
appPurchaseData.payType = "weixin";
appPurchaseData.productId = "232dddd";
appPurchaseData.productName = "皮肤";
appPurchaseData.productNum = 1;
Map<String, dynamic> customProperties = {};
customProperties['name'] = 'wyq';
customProperties['age'] = 10;
customProperties['like'] = "啤酒";
appPurchaseData.customProperties = customProperties;
SolarEngine.trackAppPurchase(appPurchaseData);
}),
SETextButtonItem("trackAdImp", "properties", (pString) {
if (pString.isNotEmpty) {
Map<String, dynamic> properties =
json.decode(pString);
SEAppImpressionData appImpressionData =
SEAppImpressionData();
appImpressionData.adNetworkADID =
properties["adNetworkADID"];
appImpressionData.adNetworkAppID =
properties["adNetworkAppID"];
appImpressionData.adNetworkPlatform =
properties["adNetworkPlatform"];
appImpressionData.mediationPlatform =
properties["mediationPlatform"];
appImpressionData.adType = properties["adType"];
appImpressionData.currencyType =
properties["currencyType"];
appImpressionData.ecpm = properties["ecpm"];
appImpressionData.isRenderSuccess =
properties["isRenderSuccess"];
appImpressionData.customProperties =
properties["customProperties"];
SolarEngine.trackAppImpress(appImpressionData);
return;
}
SEAppImpressionData appImpressionData =
SEAppImpressionData();
appImpressionData.mediationPlatform = "toutiao";
appImpressionData.adNetworkADID = "22323";
appImpressionData.adNetworkAppID = "3SDFED";
appImpressionData.adNetworkPlatform = "4";
appImpressionData.mediationPlatform = "custom";
appImpressionData.adType = 2;
appImpressionData.currencyType = "USD";
appImpressionData.ecpm = 22.9;
appImpressionData.isRenderSuccess = true;
Map<String, dynamic> customProperties = {};
customProperties['goods'] = 'shoes';
customProperties['goodsprice'] = 20;
customProperties['goodsaddress'] = "北京";
appImpressionData.customProperties = customProperties;
SolarEngine.trackAppImpress(appImpressionData);
}),
SETextButtonItem("trackAdClick", "properties", (pString) {
if (pString.isNotEmpty) {
Map<String, dynamic> properties =
json.decode(pString);
SEAdClickData adClickData = SEAdClickData();
adClickData.adPlatform = properties["adPlatform"];
adClickData.mediationPlatform =
properties["mediationPlatform"];
adClickData.adType = properties["adType"];
adClickData.adNetworkADID =
properties["adNetworkADID"];
adClickData.adType = properties["adType"];
adClickData.customProperties =
properties["customProperties"];
SolarEngine.trackAdClick(adClickData);
return;
}
SEAdClickData adClickData = SEAdClickData();
adClickData.adPlatform = "mtg";
adClickData.mediationPlatform = "solar-engine";
adClickData.adType = 1;
adClickData.adNetworkADID = "11222ffff";
Map<String, dynamic> customProperties = {};
if (pString.isNotEmpty) {
customProperties = json.decode(pString);
} else {
customProperties['app'] = 'taobao';
customProperties['sex'] = "man";
}
adClickData.customProperties = customProperties;
SolarEngine.trackAdClick(adClickData);
}),
SETextButtonItem("trackAppAttr", "properties", (pString) {
if (pString.isNotEmpty) {
Map<String, dynamic> properties =
json.decode(pString);
SEAppAttrData appAttrData = SEAppAttrData();
appAttrData.adAccountId = properties["adAccountId"];
appAttrData.adAccountName =
properties["adAccountName"];
appAttrData.adCampaignId = properties["adCampaignId"];
appAttrData.adCampaignName =
properties["adCampaignName"];
appAttrData.adCreativeId = properties["adCreativeId"];
appAttrData.adCreativeName =
properties["adCreativeName"];
appAttrData.adNetwork = properties["adNetwork"];
appAttrData.adOfferId = properties["adOfferId"];
appAttrData.adOfferName = properties["adOfferName"];
appAttrData.attributionPlatform =
properties["attributionPlatform"];
appAttrData.subChannel = properties["subChannel"];
appAttrData.customProperties =
properties["customProperties"];
SolarEngine.trackAppAttr(appAttrData);
return;
}
SEAppAttrData appAttrData = SEAppAttrData();
appAttrData.adAccountId = "2222ddd";
appAttrData.adAccountName = "mtg";
appAttrData.adCampaignId = "12323";
appAttrData.adCampaignName = "animal";
appAttrData.adCreativeId = "dkdkd11";
appAttrData.adCreativeName = "dog";
appAttrData.adNetwork = "ks";
appAttrData.adOfferId = "100oo";
appAttrData.adOfferName = "wanmeishijie";
appAttrData.attributionPlatform = "tencent";
appAttrData.subChannel = "bytedance";
Map<String, dynamic> customProperties = {};
if (pString.isNotEmpty) {
customProperties = json.decode(pString);
} else {
customProperties['channel'] = 'xiaomi';
customProperties['date'] = "10.20";
}
appAttrData.customProperties = customProperties;
SolarEngine.trackAppAttr(appAttrData);
}),
SETextButtonItem("trackRegister", "properties",
(pString) {
if (pString.isNotEmpty) {
Map<String, dynamic> properties =
json.decode(pString);
SEAppRegisterData appRegisterData =
SEAppRegisterData();
appRegisterData.regType = properties["regType"];
appRegisterData.status = properties["status"];
appRegisterData.customProperties =
properties["customProperties"];
SolarEngine.trackAppRegister(appRegisterData);
return;
}
SEAppRegisterData appRegisterData = SEAppRegisterData();
appRegisterData.regType = "QQ";
appRegisterData.status = "success";
Map<String, dynamic> customProperties = {};
if (pString.isNotEmpty) {
customProperties = json.decode(pString);
} else {
customProperties['type'] = 'wifi';
customProperties['like'] = "foods";
customProperties['re'] = "QQ";
}
appRegisterData.customProperties = customProperties;
SolarEngine.trackAppRegister(appRegisterData);
}),
SETextButtonItem("trackLogin", "properties", (pString) {
if (pString.isNotEmpty) {
Map<String, dynamic> properties =
json.decode(pString);
SEAppLoginData appLoginData = SEAppLoginData();
appLoginData.loginType = properties["regType"];
appLoginData.status = properties["status"];
appLoginData.customProperties =
properties["customProperties"];
SolarEngine.trackAppLogin(appLoginData);
return;
}
SEAppLoginData appLoginData = SEAppLoginData();
appLoginData.loginType = "weixin";
appLoginData.status = "failed";
Map<String, dynamic> customProperties = {};
if (pString.isNotEmpty) {
customProperties = json.decode(pString);
} else {
customProperties['type'] = 'wifi';
customProperties['like'] = "foods";
customProperties['re'] = "QQ";
}
appLoginData.customProperties = customProperties;
SolarEngine.trackAppLogin(appLoginData);
}),
SETextButtonItem("trackOrder", "properties", (pString) {
if (pString.isNotEmpty) {
Map<String, dynamic> properties =
json.decode(pString);
SEAppOrderData appOrderData = SEAppOrderData();
appOrderData.status = properties["status"];
appOrderData.payType = properties["payType"];
appOrderData.payAmount = properties["payAmount"];
appOrderData.orderId = properties["orderId"];
appOrderData.currencyType =
properties["currencyType"];
appOrderData.customProperties =
properties["customProperties"];
SolarEngine.trackAppOrder(appOrderData);
return;
}
SEAppOrderData appOrderData = SEAppOrderData();
appOrderData.status = "failed";
appOrderData.payType = "weixin";
appOrderData.payAmount = 20.33;
appOrderData.orderId = "111222333";
appOrderData.currencyType = "USD";
Map<String, dynamic> customProperties = {};
if (pString.isNotEmpty) {
customProperties = json.decode(pString);
} else {
customProperties['app'] = 'taobao';
customProperties['sex'] = "man";
}
appOrderData.customProperties = customProperties;
SolarEngine.trackAppOrder(appOrderData);
}),
SETextButtonItem("eventStart", "eventName",
(eventName) async {
SETimerEventData event = SETimerEventData();
event.customEventName = "timer_event_my";
Map<String, dynamic> customProperties = {};
customProperties['kind'] = 'timer';
customProperties['send'] = "ture";
event.customProperties = customProperties;
event.ts = DateTime.now().millisecondsSinceEpoch;
timerEventStr =
await SolarEngine.createTimerEvent(event);
}),
SEText2ButtonItem(
"eventFinish", "eventName", "properties",
(eventName, propertiesString) {
SolarEngine.trackTimerEvent(timerEventStr);
}),
SETextButtonItem("userInit", "properties", (pString) {
Map<String, dynamic> properties = {};
if (pString.isNotEmpty) {
properties = json.decode(pString);
} else {
properties['kind'] = "userInit";
}
SolarEngine.userInit(properties);
}),
SETextButtonItem("userUpdate", "properties", (pString) {
Map<String, dynamic> properties = {};
if (pString.isNotEmpty) {
properties = json.decode(pString);
} else {
properties['kind'] = "userUpdate";
}
SolarEngine.userUpdate(properties);
}),
SETextButtonItem("userAdd", "properties", (pString) {
Map<String, dynamic> properties = {};
if (pString.isNotEmpty) {
properties = json.decode(pString);
} else {
properties['kind'] = "userAdd";
}
SolarEngine.userAdd(properties);
}),
SETextButtonItem("userUnset", "properties", (pString) {
List<String> properties;
if (pString.isNotEmpty) {
properties = json.decode(pString);
} else {
properties = ['apple', 'orange', 'banana'];
}
SolarEngine.userUnset(properties);
}),
SETextButtonItem("userAppend", "properties", (pString) {
Map<String, dynamic> properties = {};
if (pString.isNotEmpty) {
properties = json.decode(pString);
} else {
properties['kind'] = "userAppend";
}
SolarEngine.userAppend(properties);
}),
SEButtonItem("userDeleteByAccountId", () {
SolarEngine.userDelete(
SEUserDeleteType.DELETE_BY_ACCOUNTID);
}),
SEButtonItem("userDeleteByVisitorId", () {
SolarEngine.userDelete(
SEUserDeleteType.DELETE_BY_VISITORID);
}),
],
),
),
),
],
),
),
),
);
}
}