Flutter插件antsomisdk的使用_An Antsomi CDP SDK for mobile apps
Flutter插件antsomisdk的使用_An Antsomi CDP SDK for mobile apps
功能
An Antsomi CDP SDK for mobile apps
开始使用
An Antsomi CDP SDK for mobile apps
示例代码
import 'dart:convert';
import 'package:antsomisdk/cdp_event.dart';
import 'package:antsomisdk/inbox_items.dart';
import 'package:antsomisdk/media_json.dart';
import 'package:antsomisdk/screen_observer.dart';
import 'package:antsomi_example/detail_screen.dart';
import 'package:antsomi_example/navigator_key.dart';
import 'package:antsomi_example/notification_screen.dart';
import 'package:antsomi_example/sdk.dart';
import 'package:antsomi_example/webview_screen.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:uni_links/uni_links.dart';
bool _initialURILinkHandled = false;
void printError(dynamic err, [dynamic trace, dynamic message]) {}
void main() async {
runZonedGuarded(() async {
WidgetsFlutterBinding.ensureInitialized();
AntsomiSDK.instance.config(
appGroupId: "group.flutter.example.pro",
portalId: '564890637',
propsId: '564993464',
applicationId: 'fbdfb60d-7ff6-41cd-8203-3ce029c51764');
AntsomiSDK.instance.setCustomerProperties(customerId: "1998");
AntsomiSDK.instance.resetUid();
AntsomiSDK.instance
.appInboxInit(destinationId: '8317604', audienceType: 'visitor');
AntsomiSDK.instance.requestNotificationPermission();
runApp(const MyApp());
final event = CDPEvent(en: 'view_screenview');
event.eventProps = {'screen_name': 'khanhhv'};
AntsomiSDK.instance.track(event: event);
AntsomiSDK.instance.setHandleChangeRouteTemplate(callback: (String route) {
print("route: $route");
});
}, printError);
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late CDPEvent myCDPEvent;
int _selectedIndex = 0;
int _badgeCount = 0;
List<String> _name = ['Home', 'Search', 'Notification', 'WebView'];
late final List<Widget> _body;
Future<void> getBadge() async {
final count = await AntsomiSDK.instance.getUnreadMessageCount();
print(count);
AntsomiSDK.instance.resetCustomer();
print("resetCustomer success");
debugPrint("[UID]: ${await AntsomiSDK.instance.getUid()}");
setState(() {
_badgeCount = count ?? 0;
});
// MediaJson mediaJson = await AntsomiSDK.instance.getMediaJson(event: event);
// print("webContents");
// print(jsonEncode(mediaJson));
}
@override
void initState() {
super.initState();
WidgetsFlutterBinding.ensureInitialized();
getBadge();
_body = [
const Center(
child: Icon(
Icons.home,
size: 150,
),
),
const Center(
child: Icon(
Icons.search,
size: 150,
),
),
NotificationSreen(
onReadMessage: (value) {
setState(() {
_badgeCount >= 0 ? _badgeCount = _badgeCount - value : 0;
});
},
onReceiveNewMessage: () {
setState(() {
_badgeCount = _badgeCount + 1;
});
},
onTapMessage: (p0) {
NavigatorKey.instance.currentState
?.pushNamed("/detail", arguments: p0);
},
),
// const WebViewApp(
// url:
// "https://sandbox-template.ants.vn/thanghn1/test-notification.html?v=3",
// )
];
_initURIHandler();
_incomingLinkHandler();
}
@override
void dispose() {
_streamSubscription?.cancel();
super.dispose();
}
void onPressNavBar(int index) {
setState(() {
_selectedIndex = index;
});
AntsomiSDK.instance.trackScreen(name: _name[_selectedIndex]);
}
/// DEEP LINK HANDLER
StreamSubscription? _streamSubscription;
Future<void> _initURIHandler() async {
if (!_initialURILinkHandled) {
_initialURILinkHandled = true;
try {
final initialURI = await getInitialUri();
if (initialURI != null) {
debugPrint("Initial URI received $initialURI");
if (!mounted) {
return;
}
AntsomiSDK.instance.handleDeepLink(url: initialURI);
final res = await AntsomiSDK.instance
.getMessageById(messageId: initialURI.path.split('/')[1]);
//Parse deep link if app open from another app(or web) when being terminated
WidgetsBinding.instance.addPostFrameCallback((_) {
NavigatorKey.instance.currentState
?.pushNamed("/detail", arguments: res);
});
} else {
debugPrint("Null Initial URI received");
}
} on PlatformException {
debugPrint("Failed to receive initial uri");
} on FormatException {
if (!mounted) {
return;
}
debugPrint('Malformed Initial URI received');
}
}
}
void _incomingLinkHandler() async {
if (!kIsWeb) {
_streamSubscription = uriLinkStream.listen((Uri? uri) async {
// Parse deep link and get information into CDP event
AntsomiSDK.instance.handleDeepLink(url: uri!);
final res = await AntsomiSDK.instance
.getMessageById(messageId: uri.path.split('/')[1]);
WidgetsBinding.instance.addPostFrameCallback((_) {
NavigatorKey.instance.currentState
?.pushNamed("/detail", arguments: res);
});
}, onError: (Object err) {
if (!mounted) {
return;
}
debugPrint('Error occurred: $err');
});
if (!mounted) {
return;
}
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorKey: NavigatorKey.instance,
navigatorObservers: [ScreenObserver()],
initialRoute: '/home',
routes: {
'/home': (context) => _homeWidget(),
},
onGenerateRoute: (settings) {
switch (settings.name) {
case '/detail':
final arguments = settings.arguments;
if (arguments is Map<String, String>) {
final resultShow = arguments;
return MaterialPageRoute(
settings: settings,
builder: (context) => DetailScreen(
heading: resultShow['heading']!,
content: resultShow['content']!,
urlImage: resultShow['imageURL']!,
time: resultShow['time']!,
name: resultShow['name']!,
onDispose: () {},
),
);
} else if (arguments is InboxItem) {
final result = arguments;
return MaterialPageRoute(
settings: settings,
builder: (context) => DetailScreen(
heading: result.heading!,
content: result.content!,
urlImage: result.imageUrl!,
time: result.dateCreated!.toIso8601String(),
name: result.appUrl!,
onDispose: () {},
),
);
}
}
return null;
},
);
}
Scaffold _homeWidget() {
return Scaffold(
body: IndexedStack(
index: _selectedIndex,
children: _body,
),
bottomNavigationBar: BottomNavigationBar(
unselectedItemColor: Colors.black,
elevation: 0,
selectedIconTheme: const IconThemeData(color: Colors.blue, size: 28),
showUnselectedLabels: true,
selectedLabelStyle: const TextStyle(color: Colors.blue),
selectedItemColor: Colors.blue,
onTap: onPressNavBar,
currentIndex: _selectedIndex,
items: [
const BottomNavigationBarItem(
icon: Icon(CupertinoIcons.home),
label: "Home",
),
const BottomNavigationBarItem(
icon: Icon(CupertinoIcons.search), label: "Search"),
BottomNavigationBarItem(
icon: Stack(
children: [
const Icon(CupertinoIcons.bell),
Positioned(
right: 0,
child: _badgeCount != 0
? Container(
padding: const EdgeInsets.all(1),
decoration: BoxDecoration(
color: Colors.red,
borderRadius: BorderRadius.circular(10),
),
constraints: const BoxConstraints(
minWidth: 16,
minHeight: 16,
),
child: Text(
'$_badgeCount',
style: const TextStyle(
color: Colors.white,
fontSize: 10,
),
textAlign: TextAlign.center,
),
)
: Container(),
)
],
),
label: "Notifications"),
const BottomNavigationBarItem(
icon: Icon(CupertinoIcons.cart), label: "Cart")
],
),
);
}
}
潜在用途
该插件 antsomisdk
可以用于构建具有高级功能的移动应用。例如,它支持用户属性设置、事件跟踪、通知管理等。
用户属性设置
通过 setCustomerProperties
方法,可以设置用户的属性,如用户ID。这有助于分析用户行为并进行个性化推荐。
AntsomiSDK.instance.setCustomerProperties(customerId: "1998");
事件跟踪
通过 track
方法,可以跟踪特定事件,例如页面视图或按钮点击。
final event = CDPEvent(en: 'view_screenview');
event.eventProps = {'screen_name': 'khanhhv'};
AntsomiSDK.instance.track(event: event);
深度链接处理
通过 handleDeepLink
方法,可以处理深度链接,这在用户从其他应用或网页打开应用时非常有用。
AntsomiSDK.instance.handleDeepLink(url: initialURI);
通知管理
通过 requestNotificationPermission
方法,可以请求通知权限,并且可以通过 getUnreadMessageCount
获取未读消息的数量。
AntsomiSDK.instance.requestNotificationPermission();
final count = await AntsomiSDK.instance.getUnreadMessageCount();
print(count);
更多关于Flutter插件antsomisdk的使用_An Antsomi CDP SDK for mobile apps的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter插件antsomisdk的使用_An Antsomi CDP SDK for mobile apps的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在探讨Flutter中未知功能插件antsomisdk
的潜在使用时,由于antsomisdk
不是一个广为人知的或官方文档明确记录的插件,我无法提供确切的官方文档或广泛认可的使用案例。不过,基于一般Flutter插件的使用习惯和假设antsomisdk
遵循标准的Flutter插件架构,我可以提供一个假设性的代码示例来展示如何集成和使用一个假想的第三方Flutter插件。
请注意,以下代码是基于假设的,实际使用antsomisdk
时需要根据其实际提供的API和功能进行调整。
假设性代码示例
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加antsomisdk
作为依赖(注意:这里的依赖名称是假设的,实际使用时请替换为真实插件名称)。
dependencies:
flutter:
sdk: flutter
antsomisdk: ^x.y.z # 替换为实际版本号
然后运行flutter pub get
来安装依赖。
2. 导入插件
在你的Dart文件中导入插件:
import 'package:antsomisdk/antsomisdk.dart';
3. 初始化插件
假设antsomisdk
需要初始化,你可以在应用的入口文件(如main.dart
)中进行初始化:
void main() {
WidgetsFlutterBinding.ensureInitialized();
// 初始化antsomisdk,假设它有一个名为initialize的方法
AntsoMiSdk.initialize().then((result) {
if (result) {
print('AntsoMiSdk initialized successfully');
} else {
print('Failed to initialize AntsoMiSdk');
}
}).catchError((error) {
print('Error initializing AntsoMiSdk: $error');
});
runApp(MyApp());
}
4. 使用插件功能
假设antsomisdk
提供了一个名为fetchData
的方法,你可以在你的应用中调用它:
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String? dataFromPlugin;
@override
void initState() {
super.initState();
// 调用插件方法
_fetchDataFromPlugin();
}
Future<void> _fetchDataFromPlugin() async {
try {
String result = await AntsoMiSdk.fetchData();
setState(() {
dataFromPlugin = result;
});
} catch (error) {
print('Error fetching data from AntsoMiSdk: $error');
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('AntsoMiSdk Demo'),
),
body: Center(
child: dataFromPlugin != null
? Text('Data from plugin: $dataFromPlugin')
: CircularProgressIndicator(),
),
),
);
}
}
注意事项
- 实际API:上面的代码示例是基于假设的API方法名(如
initialize
和fetchData
)。实际使用时,你需要参考antsomisdk
的官方文档或源代码来了解其提供的API和功能。 - 错误处理:在实际应用中,务必添加适当的错误处理逻辑,以处理插件初始化失败或方法调用失败的情况。
- 平台特定代码:如果
antsomisdk
包含平台特定的代码(如iOS和Android),你可能需要在相应的原生代码文件中进行配置和初始化。
由于antsomisdk
的具体信息未知,上述代码仅作为示例,实际使用时请参照插件的官方文档或联系插件的维护者获取更多信息。