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 logsdebugPrint

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'),
          ),
        ),
      ),
    );
  }
}
回到顶部