Flutter插件antsomi的使用方法详解
Flutter插件antsomi的使用方法详解
antsomi
开发者:Hieu Huynh Minh
GitHub: https://github.com/hieuhm2k
Feature
An Antsomi CDP SDK for mobile apps
Getting Started
An Antsomi CDP SDK for mobile apps
完整示例代码
以下是一个完整的示例代码,展示如何在Flutter应用中使用antsomi
插件。
import 'package:antsomi/antsomi.dart';
import 'package:antsomi/cdp_event.dart';
import 'package:antsomi/inbox_items.dart';
import 'package:antsomi/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 main() async {
WidgetsFlutterBinding.ensureInitialized();
// 配置Antsomi SDK
AntsomiSDK.instance.config(
appGroupId: "group.MyFCMApp",
portalId: "33167",
propsId: "556300706",
applicationID: "e4e8d06e-4d97-43df-93e8-c36238147ca0");
// 设置客户属性
AntsomiSDK.instance
.setCustomerProperties(customerID: "4c34bdc60aeb47d1ca0abefeb30eee82");
// 初始化应用内收件箱
AntsomiSDK.instance
.appInboxInit(destinationID: 1300598, audienceType: "customer");
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
[@override](/user/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();
debugPrint("[UID]: ${await AntsomiSDK.instance.getUID()}");
setState(() {
_badgeCount = count ?? 0;
});
}
[@override](/user/override)
void initState() {
super.initState();
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](/user/override)
void dispose() {
_streamSubscription?.cancel();
super.dispose();
}
void onPressNavBar(int index) {
setState(() {
_selectedIndex = index;
});
AntsomiSDK.instance.trackScreen(name: _name[_selectedIndex]);
}
/// 深链接处理器
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.parseDeepLink(initialURI);
// 获取消息详情
final res = await AntsomiSDK.instance
.getMessageByID(messageID: initialURI.path.split('/')[1]);
// 解析深链接并跳转到详情页
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 {
// 解析深链接并触发事件
AntsomiSDK.instance.parseDeepLink(uri!);
final res = await AntsomiSDK.instance
.getMessageByID(messageID: uri.path.split('/')[1]);
WidgetsBinding.instance.addPostFrameCallback((_) {
NavigatorKey.instance.currentState
?.pushNamed("/detail", arguments: res);
AntsomiSDK.instance.track(event: myCDPEvent);
});
}, onError: (Object err) {
if (!mounted) {
return;
}
debugPrint('Error occurred: $err');
});
if (!mounted) {
return;
}
}
}
[@override](/user/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['ctime']!,
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.webUrl!,
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")
],
),
);
}
}
更多关于Flutter插件antsomi的使用方法详解的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter插件antsomi的使用方法详解的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在使用 Flutter 进行开发时,可能会遇到一些未知或不太常见的插件,例如 antsomi
。由于 antsomi
不是一个广泛使用的 Flutter 插件,因此关于它的具体功能和用法可能会比较模糊。以下是一些探索和使用未知插件的一般步骤和建议:
1. 查找插件的官方文档
- 首先,尝试查找插件的官方文档或 README 文件。通常在插件的 GitHub 页面或 Pub.dev 页面上会有详细的说明。
- 如果插件有官方网站,访问官网以获取更多信息。
2. 检查插件的源代码
- 如果文档不完整或缺失,你可以直接查看插件的源代码。大多数 Flutter 插件都是开源的,你可以在 GitHub 上找到它们的代码库。
- 通过阅读代码,你可以了解插件的功能、用法和实现细节。
3. 查看示例代码
- 许多插件会提供示例代码或演示项目,这些示例通常位于
example
目录下。运行示例代码可以帮助你快速理解插件的用法。
4. 阅读插件的依赖项
- 查看插件的
pubspec.yaml
文件,了解它依赖的其他库或插件。这可以帮助你理解插件的功能范围和可能的使用场景。
5. 尝试集成到项目中
- 创建一个简单的 Flutter 项目,并尝试将插件集成到项目中。通过实际使用,你可以更好地理解插件的功能。
- 在集成过程中,注意插件的初始化、配置和使用方法。
6. 调试和日志
- 如果插件在集成过程中出现问题,使用调试工具和日志来排查问题。Flutter 提供了强大的调试工具,如
flutter logs
和debugPrint
。
7. 社区和论坛
- 如果遇到问题或需要进一步的帮助,可以在 Flutter 社区或论坛中寻求帮助。例如,Stack Overflow、Flutter 官方论坛、GitHub Issues 等。
- 描述你遇到的问题,并提供相关的代码片段和错误信息。
8. 联系插件维护者
- 如果插件有活跃的维护者,可以通过 GitHub Issues 或电子邮件联系他们,询问关于插件的问题或建议。
9. 编写自定义代码
- 如果插件无法满足你的需求,或者你无法找到足够的信息,考虑编写自定义代码或寻找替代插件。
10. 备份和测试
- 在集成新插件时,确保备份你的项目,并在测试环境中进行充分的测试,以避免对生产环境造成影响。
示例:假设 antsomi
是一个广告插件
假设 antsomi
是一个用于集成广告的插件,以下是一个简单的集成示例:
dependencies:
flutter:
sdk: flutter
antsomi: ^1.0.0 # 假设版本为 1.0.0
import 'package:flutter/material.dart';
import 'package:antsomi/antsomi.dart'; // 假设导入路径
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Antsomi Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
// 假设插件有一个方法用于显示广告
Antsomi.showAd();
},
child: Text('Show Ad'),
),
),
),
);
}
}