Flutter插件mpost的使用_mpost插件提供了与Mpost REST API交互的简单接口,并支持多平台

Flutter插件mpost的使用_mpost插件提供了与Mpost REST API交互的简单接口,并支持多平台

本文将详细介绍如何在Flutter应用中使用mpost插件来集成Mpost的服务。mpost插件提供了与Mpost REST API交互的简单接口,并支持多平台(移动设备、桌面和浏览器)。

Flutter插件mpost的使用方法

你可以通过创建一个Mpost对象并使用你的API密钥来保持与Mpost服务的持久连接。

import 'package:mpost/models/distance.dart';
import 'package:mpost/models/distanceRequest.dart';
import 'package:mpost/models/place.dart';
import 'package:mpost/mpost.dart';

final mpost = Mpost("YOUR-API-KEY");

// 计算距离
Place pickupAddress = Place(latitude: -0.9534506, longitude: 37.0820681);
Place deliveryAddress = Place(latitude: -1.046594, longitude: 37.060197);

DistanceRequest distanceRequest = DistanceRequest(
    delivery_address: deliveryAddress, pickup_address: pickupAddress);

Distance distance = await mpost.calculateDistance(distanceRequest);

// 创建配送请求
Address deliveryAddress = Address(
    latitude: 40.659569,
    longitude: -73.933783,
    address: "Globe Round About",
    detailed_address:
        "Sunrays House, Near Globe Cinema Roundabout, Nairobi City");

Address pickupAddress = Address(
    latitude: 37.785834,
    longitude: -122.406417,
    address: "Globe Round About",
    detailed_address:
        "Sunrays House, Near Globe Cinema Roundabout, Nairobi City");

NewDeliveryRequest newDeliveryRequest = NewDeliveryRequest(
      delivery_address: deliveryAddress,
      item_type: 'Food',
      pickup_time: '2022-08-20 11:11:00',
      pickup_address: pickupAddress,
      recipient_mobile: '0712695820',
      recipient_name: 'Elias Baya',
    );

DeliveryRequest deliveryRequest = await mpost.createDeliveryRequest(newDeliveryRequest);

// 获取所有配送请求
List<DeliveryRequest> deliveryRequests = await mpost.getDeliveryRequests();

// 获取单个配送请求
DeliveryRequest deliveryRequest = await mpost.getDeliveryRequest(130);

可用的方法

mpost插件提供了以下方法:

  • getDeliveryRequests()
  • getDeliveryRequestById(int)
  • createDeliveryRequest(queryObject)
  • calculateDistance(queryObject)

创建配送请求案例研究

下图展示了创建配送请求的过程:

创建配送请求

示例代码

以下是一个完整的示例代码,演示了如何在Flutter应用中使用mpost插件来创建新的配送请求和展示现有配送请求。

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:mpost/models/address.dart';
import 'package:mpost/models/deliveryRequest.dart';
import 'package:mpost/models/distance.dart';
import 'package:mpost/models/distanceRequest.dart';
import 'package:mpost/models/newDeliveryRequest.dart';
import 'package:mpost/models/place.dart';
import 'package:mpost/mpost.dart';
import 'package:permission_handler/permission_handler.dart';

void main() {
  runApp(MyApp());
}

final mpost = Mpost("YOUR-MPOST-API-KEY");

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 2,
      child: Scaffold(
          appBar: AppBar(
            elevation: 0.0,
            title: const Text("SHIP WITH MPOST"),
            backgroundColor: Colors.blue,
            bottom: const TabBar(
              tabs: [
                Tab(text: "New Delivery Request"),
                Tab(text: "Delivery Requests")
              ],
            ),
          ),
          body: const TabBarView(
            children: [
              NewDeliveryRequestPage(),
              DeliveryRequestsPage(),
            ],
          )),
    );
  }
}

class NewDeliveryRequestPage extends StatefulWidget {
  const NewDeliveryRequestPage({Key key}) : super(key: key);

  [@override](/user/override)
  State<NewDeliveryRequestPage> createState() => _NewDeliveryRequestPageState();
}

class _NewDeliveryRequestPageState extends State<NewDeliveryRequestPage> {
  final Completer<GoogleMapController> _controller = Completer();
  static const CameraPosition _nairobi = CameraPosition(
    target: LatLng(-1.362863, 36.834583),
    zoom: 8,
  );
  Set<Marker> markersSet = {};

  String pickup_address = "Select Address";
  double pickupLatitude = 0;
  double pickupLongitude = 0;
  String delivery_address = "Select Address";
  double deliveryLatitude = 0;
  double deliveryLongitude = 0;

  Position currentPosition;

  GoogleMapController newGoogleMapController;

  BitmapDescriptor locationPin;

  Loader loader;

  String deliveryDistance = "0";
  String rate = "0";
  String total = "0";

  List<LatLng> pLinesCoordinates = [];
  Set<Polyline> polyLineSet = {};
  Set<Circle> circlesSet = {};

  [@override](/user/override)
  void initState() {
    setCustomMapPin();
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    loader = Loader(context);
    return SingleChildScrollView(
      physics: const BouncingScrollPhysics(),
      child: Column(
        children: [
          GestureDetector(
            onTap: () async {
              // 选择取货地址
              // ...
            },
            child: Card(
              margin: const EdgeInsets.all(10),
              child: ListTile(
                leading: const Icon(
                  Icons.location_on_rounded,
                  color: Colors.red,
                  size: 40,
                ),
                title: const Text("Pickup Address"),
                subtitle: Text(pickup_address),
                trailing: const Icon(Icons.arrow_forward_ios),
              ),
            ),
          ),
          GestureDetector(
            onTap: () async {
              // 选择送货地址
              // ...
            },
            child: Card(
              margin: const EdgeInsets.all(10),
              child: ListTile(
                leading: const Icon(
                  Icons.location_on_rounded,
                  color: Colors.indigo,
                  size: 40,
                ),
                title: const Text("Delivery Address"),
                subtitle: Text(delivery_address),
                trailing: const Icon(Icons.arrow_forward_ios),
              ),
            ),
          ),
          Card(
            margin: const EdgeInsets.all(10),
            child: SizedBox(
              width: MediaQuery.of(context).size.width,
              child: Column(
                children: [
                  const SizedBox(
                    height: 10,
                  ),
                  const Text(
                    "Cost Calculations",
                    style: TextStyle(fontSize: 20),
                  ),
                  const SizedBox(
                    height: 10,
                  ),
                  Padding(
                    padding: const EdgeInsets.symmetric(horizontal: 20),
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: [
                        const Text("Distance"),
                        Text("${int.parse(deliveryDistance) / 1000} Km")
                      ],
                    ),
                  ),
                  const Divider(
                    indent: 20,
                    endIndent: 20,
                  ),
                  Padding(
                    padding: const EdgeInsets.symmetric(horizontal: 20),
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: [const Text("Rate"), Text("$rate/km")],
                    ),
                  ),
                  const Divider(
                    indent: 20,
                    endIndent: 20,
                  ),
                  Padding(
                    padding: const EdgeInsets.symmetric(horizontal: 20),
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: [
                        const Text("Total"),
                        Text(
                          "Ksh $total",
                          style: const TextStyle(
                              fontSize: 20,
                              color: Colors.indigo,
                              fontWeight: FontWeight.bold),
                        )
                      ],
                    ),
                  ),
                ],
              ),
            ),
          ),
          Card(
            margin: const EdgeInsets.all(10),
            child: SizedBox(
              width: MediaQuery.of(context).size.width,
              height: 270,
              child: GoogleMap(
                mapType: MapType.normal,
                initialCameraPosition: _nairobi,
                myLocationButtonEnabled: true,
                padding: const EdgeInsets.only(bottom: 50),
                markers: markersSet,
                polylines: polyLineSet,
                circles: circlesSet,
                onMapCreated: (GoogleMapController controller) {
                  _controller.complete(controller);
                  newGoogleMapController = controller;
                  locatePosition();
                },
              ),
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(10),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                GestureDetector(
                  onTap: () async {
                    // 计算距离
                    // ...
                  },
                  child: const Card(
                    color: Colors.indigo,
                    child: SizedBox(
                      width: 100,
                      height: 45,
                      child: Center(
                          child: Text(
                        "Calculate",
                        style: TextStyle(
                            color: Colors.white, fontWeight: FontWeight.bold),
                      )),
                    ),
                  ),
                ),
                GestureDetector(
                  onTap: () {
                    // 提交配送请求
                    // ...
                  },
                  child: const Card(
                    color: Colors.green,
                    child: SizedBox(
                      width: 100,
                      height: 45,
                      child: Center(
                          child: Text(
                        "Proceed",
                        style: TextStyle(
                            color: Colors.white, fontWeight: FontWeight.bold),
                      )),
                    ),
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }

  setCustomMapPin() async {
    locationPin = await BitmapDescriptor.fromAssetImage(
        const ImageConfiguration(devicePixelRatio: 2.5),
        'assets/icons/pin.png');
  }

  void locatePosition() async {
    Map<Permission, PermissionStatus> statuses = await [
      Permission.location,
    ].request();
    if (kDebugMode) {
      print(statuses[Permission.location]);
    }
    if (statuses[Permission.location].isDenied) {
      requestPermission(Permission.location);
    } else {
      Position position = await Geolocator.getCurrentPosition(
          desiredAccuracy: LocationAccuracy.high);
      currentPosition = position;

      setState(() {
        markersSet.add(
          Marker(
              markerId: const MarkerId("client"),
              position: LatLng(position.latitude, position.longitude),
              anchor: const Offset(0, 0.85),
              infoWindow: const InfoWindow(
                  title: "Home Address", snippet: "Current Location"),
              icon: locationPin),
        );
      });

      LatLng latLngPosition = LatLng(position.latitude, position.longitude);
      CameraPosition cameraPosition =
          CameraPosition(target: latLngPosition, zoom: 16);
      newGoogleMapController
          .animateCamera(CameraUpdate.newCameraPosition(cameraPosition));
    }
  }

  Future<void> requestPermission(Permission permission) async {
    await permission.request();
  }

  bool allDataAvailable() {
    if (pickup_address != "Select Address" && delivery_address != "Select Address") {
      if (kDebugMode) {
        print("All Data Is Available****************");
      }
      return true;
    } else {
      if (kDebugMode) {
        print("Some Data Is Null****************");
      }
      return false;
    }
  }

  void getPlaceDirection(LatLng pickupAddress, LatLng deliveryAddress) async {
    // 获取路线方向
    // ...
  }
}

class DeliveryRequestsPage extends StatefulWidget {
  const DeliveryRequestsPage({Key key}) : super(key: key);

  [@override](/user/override)
  State<DeliveryRequestsPage> createState() => _DeliveryRequestsPageState();
}

class _DeliveryRequestsPageState extends State<DeliveryRequestsPage> {
  List<DeliveryRequest> deliveryRequests = [];

  [@override](/user/override)
  void initState() {
    loadDeliveryRequests();
    super.initState();
  }

  loadDeliveryRequests() async {
    deliveryRequests = await mpost.getDeliveryRequests();
    setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ListView.builder(
        itemCount: deliveryRequests.length,
        itemBuilder: (context, index) {
          return Card(
            margin: const EdgeInsets.symmetric(vertical: 5),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Padding(
                  padding: const EdgeInsets.symmetric(horizontal: 20),
                  child: Text(
                    "#ID:${deliveryRequests[index].id}",
                    style: const TextStyle(
                        fontSize: 18, fontWeight: FontWeight.bold),
                  ),
                ),
                ListTile(
                  leading: const Icon(
                    Icons.location_on,
                    color: Colors.red,
                  ),
                  title: const Text("Pickup Address"),
                  subtitle: Text(deliveryRequests[index].pickupAddress.address),
                  trailing: Text(
                    getFormattedDate(deliveryRequests[index].created_at),
                    style: const TextStyle(color: Colors.black),
                  ),
                ),
                ListTile(
                  leading: const Icon(
                    Icons.location_on,
                    color: Colors.indigo,
                  ),
                  title: const Text("Delivery Address"),
                  subtitle:
                      Text(deliveryRequests[index].deliveryAddress.address),
                  trailing: Text(
                    deliveryRequests[index].status.name,
                    style: const TextStyle(color: Colors.green),
                  ),
                ),
              ],
            ),
          );
        });
  }

  /// Get date as a string for display.
  String getFormattedDate(String date) {
    /// Convert into local date format.
    var localDate = DateTime.parse(date).toLocal();

    /// inputFormat - format getting from api or other func.
    /// e.g If 2021-05-27 9:34:12.781341 then format must be yyyy-MM-dd HH:mm
    /// If 27/05/2021 9:34:12.781341 then format must be dd/MM/yyyy HH:mm
    var inputFormat = DateFormat('yyyy-MM-dd HH:mm');
    var inputDate = inputFormat.parse(localDate.toString());

    /// outputFormat - convert into format you want to show.
    var outputFormat = DateFormat('dd-MM-yyyy HH:mm');
    var outputDate = outputFormat.format(inputDate);

    return outputDate.toString();
  }
}

更多关于Flutter插件mpost的使用_mpost插件提供了与Mpost REST API交互的简单接口,并支持多平台的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件mpost的使用_mpost插件提供了与Mpost REST API交互的简单接口,并支持多平台的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


mpost 是一个 Flutter 插件,用于在 Android 平台上发送短信。它提供了一种简单的方式来发送 SMS(短消息服务)消息,而无需使用 Android 系统默认的短信应用程序。通过 mpost 插件,开发者可以直接从 Flutter 应用中发送短信,这使得它非常适合需要自动化短信发送的场景,如验证码、通知等。

安装 mpost 插件

首先,你需要在 pubspec.yaml 文件中添加 mpost 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  mpost: ^1.0.0  # 请使用最新版本

然后,运行 flutter pub get 来安装插件。

使用 mpost 插件

在 Dart 代码中,你可以使用 Mpost 类来发送短信。以下是一个简单的示例:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('mpost Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                bool result = await Mpost.sendSms(
                  phoneNumber: '+1234567890', // 接收者的电话号码
                  message: 'Hello from Flutter!', // 短信内容
                );

                if (result) {
                  print('SMS sent successfully!');
                } else {
                  print('Failed to send SMS.');
                }
              } catch (e) {
                print('Error: $e');
              }
            },
            child: Text('Send SMS'),
          ),
        ),
      ),
    );
  }
}

解释

  • Mpost.sendSms 方法用于发送短信。它需要两个参数:

    • phoneNumber: 接收短信的电话号码。
    • message: 短信内容。
  • sendSms 方法返回一个 bool 值,表示短信是否成功发送。

注意事项

  1. 权限: 在 Android 上发送短信需要 SEND_SMS 权限。你需要在 AndroidManifest.xml 文件中添加以下权限:

    <uses-permission android:name="android.permission.SEND_SMS" />
    
  2. 运行时权限: 从 Android 6.0(API 23)开始,SEND_SMS 权限需要在运行时请求。你可以使用 permission_handler 插件来处理运行时权限。

  3. 短信发送限制: 在某些设备或运营商上,可能会有短信发送的限制。确保你的应用在发送短信时遵守相关法律法规。

处理运行时权限

你可以使用 permission_handler 插件来请求 SEND_SMS 权限。以下是如何在发送短信之前请求权限的示例:

import 'package:permission_handler/permission_handler.dart';

Future<void> requestSmsPermission() async {
  var status = await Permission.sms.status;
  if (!status.isGranted) {
    status = await Permission.sms.request();
    if (!status.isGranted) {
      throw Exception('SMS permission denied');
    }
  }
}

// 在发送短信之前调用 requestSmsPermission
await requestSmsPermission();
bool result = await Mpost.sendSms(phoneNumber: '+1234567890', message: 'Hello from Flutter!');
回到顶部