Flutter插件meili_flutter的介绍与使用方法

Flutter插件meili_flutter的介绍与使用方法

Meili Flutter 插件简介

Meili Flutter 插件允许您将 Meili 的体验集成到您的 Flutter 应用程序中。通过该插件,您可以轻松实现卡支付、预订管理等功能。

功能特点

  • 跨平台支持:Meili 插件支持 iOS 和 Android 平台。
  • 可定制化 UI:提供强大的、可自定义的 UI 屏幕和元素,用于收集用户详细信息。
  • 直接集成:与 Meili 直接集成,确保无缝的用户体验。
  • 平台特定实现:为 iOS 和 Android 提供不同的实现,以确保每个平台的最佳性能。

安装

pubspec.yaml 文件中添加以下依赖项:

dependencies:
    meili_flutter: ^1.0.0

运行以下命令以安装包:

flutter pub get

要求

  • iOS 版本:16.0 或更高版本
  • Android 版本:根据项目的最低 SDK 要求

iOS

与目标 iOS 16 或更高版本的 App 兼容。

project.pbxproj 中更新 iOS 部署目标为 13.0,或者在 Xcode 的 Build Settings 中进行设置。

更新 Podfile

source 'https://github.com/meili-travel-tech/meili-ios-pods'

platform :ios, '16.0'

使用

卡支付

有三种处理卡支付的方法:

方法 易用性 描述 文档链接
Meili Sheet View 简单 打开一个包含 Meili 流程的表单视图 Meili 支持
Meili Connect Widget 简单 原生 Flutter 小部件,可以与其他 Flutter 小部件一起嵌入 Meili 支持

Meili Direct

要打开 Meili 的直接流视图,使用以下代码片段:

import 'package:meili_flutter/meili_flutter.dart';

void _openMeiliView() async {
    final params = MeiliParams(
      ptid: 'ptid',
      currentFlow: FlowType.direct,
      env: 'dev',
    );

    try {
      await Meili.openMeiliView(params);
    } catch (e) {
      print("Failed to open MeiliView: $e");
    }
}

Meili Booking Manager

要打开 Meili 的预订管理流视图,使用以下代码片段:

import 'package:meili_flutter/meili_flutter.dart';

void _openMeiliView() async {
    final params = MeiliParams(
      ptid: 'ptid',
      currentFlow: FlowType.bookingManager,
      env: 'dev',
      bookingParams: BookingParams(
        confirmationId: "1234ABCD",
        lastName: "Doe"
      )
    );

    try {
      await Meili.openMeiliView(params);
    } catch (e) {
      print("Failed to open MeiliView: $e");
    }
}

Meili Connect

要使用 MeiliConnectWidget,将其集成到您的小部件树中,并传递必要的参数:

import 'package:flutter/material.dart';
import 'package:meili_flutter/meili_flutter.dart';

MeiliConnectWidget(
  ptid: '100.10',
  env: 'dev',
  availParams: AvailParams(
    pickupLocation: 'BCN',
    dropoffLocation: 'BCN',
    pickupDate: '2025-01-01',
    pickupTime: '12:00',
    dropoffDate: '2025-01-07',
    dropoffTime: '12:00',
    driverAge: 25,
    currencyCode: 'EUR',
    residency: 'IE',
  )
);

错误处理

如果在尝试打开 Meili 视图时发生错误,将抛出 PlatformException,并且错误消息将打印到控制台。

平台支持

iOS

Meili 视图在 iOS 上受支持。iOS 的 MethodChannelmeili_flutter_ios

Android

我们正在努力将 Meili Android SDK 集成到 Meili Flutter 插件中。Meili 视图对 Android 的支持很快就会可用。在此期间,尝试在 Android 上打开 Meili 视图可能会导致 PlatformException,错误消息为 “Android platform view is not yet supported”。

示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 Meili 插件:

import 'package:flutter/cupertino.dart';
import 'package:meili_flutter/meili_flutter.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const CupertinoApp(home: TabHomePage());
  }
}

class TabHomePage extends StatefulWidget {
  const TabHomePage({super.key});

  [@override](/user/override)
  State<TabHomePage> createState() => _TabHomePageState();
}

class _TabHomePageState extends State<TabHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return CupertinoTabScaffold(
      tabBar: CupertinoTabBar(
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            label: 'Direct',
            icon: Icon(CupertinoIcons.arrow_right),
          ),
          BottomNavigationBarItem(
            label: 'Connect',
            icon: Icon(CupertinoIcons.link),
          ),
          BottomNavigationBarItem(
            label: 'Booking Manager',
            icon: Icon(CupertinoIcons.person),
          ),
        ],
      ),
      tabBuilder: (context, index) {
        switch (index) {
          case 0:
            return const MeiliDirectFlowButton();
          case 1:
            return const HomePage();
          case 2:
            return const MeiliBookingManagerFlowButton();
          default:
            return Container();
        }
      },
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      navigationBar: const CupertinoNavigationBar(
        middle: Text('IN PATH BOOKING'),
      ),
      child: SafeArea(
        child: SingleChildScrollView(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              const Padding(
                padding: EdgeInsets.all(8),
                child: Text(
                  'Welcome to the Flutter Example App',
                  style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
                ),
              ),
              const Padding(
                padding: EdgeInsets.all(8),
                child: Text(
                  'This is some dummy content above the MeiliView widget.',
                  style: TextStyle(fontSize: 16),
                ),
              ),
              const Padding(
                padding: EdgeInsets.all(8),
                child: Text(
                  'More dummy content above the MeiliView widget.',
                  style: TextStyle(fontSize: 16),
                ),
              ),
              const Padding(
                padding: EdgeInsets.all(8),
                child: Text(
                  'Even more dummy content above the MeiliView widget.',
                  style: TextStyle(fontSize: 16),
                ),
              ),

              // MeiliConnectWidget
              MeiliConnectWidget(
                ptid: '125.10',
                env: 'prod',
                availParams: AvailParams(
                  pickupLocation: 'MUC',
                  dropoffLocation: 'MUC',
                  pickupDate: '2025-01-01',
                  pickupTime: '12:00',
                  dropoffDate: '2025-01-07',
                  dropoffTime: '12:00',
                  driverAge: 25,
                  currencyCode: 'EUR',
                  residency: 'IE',
                ),
              ),

              // Dummy content below the MeiliView
              const Padding(
                padding: EdgeInsets.all(8),
                child: Text(
                  'This is some dummy content below the MeiliView widget.',
                  style: TextStyle(fontSize: 16),
                ),
              ),
              const Padding(
                padding: EdgeInsets.all(8),
                child: Text(
                  'Enjoy exploring the app!',
                  style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
                ),
              ),
              const Padding(
                padding: EdgeInsets.all(8),
                child: Text(
                  'Even more dummy content below the MeiliView widget.',
                  style: TextStyle(fontSize: 16),
                ),
              ),
              const Padding(
                padding: EdgeInsets.all(8),
                child: Text(
                  'More dummy content below the MeiliView widget.',
                  style: TextStyle(fontSize: 16),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class MeiliDirectFlowButton extends StatelessWidget {
  const MeiliDirectFlowButton({super.key});

  Future<void> _openMeiliView() async {
    final params = MeiliParams(
      ptid: '100.9',
      flow: FlowType.direct,
      env: 'dev',
    );

    try {
      await Meili.openMeiliView(params);
    } catch (e) {
      print('Failed to open MeiliView: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return CupertinoButton(
      onPressed: _openMeiliView,
      child: const Text('Open Meili Direct'),
    );
  }
}

class MeiliBookingManagerFlowButton extends StatelessWidget {
  const MeiliBookingManagerFlowButton({super.key});

  Future<void> _openMeiliView() async {
    final params = MeiliParams(
      ptid: '100.9',
      flow: FlowType.bookingManager,
      env: 'dev',
    );

    try {
      await Meili.openMeiliView(params);
    } catch (e) {
      print('Failed to open MeiliView: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return CupertinoButton(
      onPressed: _openMeiliView,
      child: const Text('Open Meili Booking Manager'),
    );
  }
}

更多关于Flutter插件meili_flutter的介绍与使用方法的实战教程也可以访问 https://www.itying.com/category-92-b0.html

回到顶部