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
更多关于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
值,表示短信是否成功发送。
注意事项
-
权限: 在 Android 上发送短信需要
SEND_SMS
权限。你需要在AndroidManifest.xml
文件中添加以下权限:<uses-permission android:name="android.permission.SEND_SMS" />
-
运行时权限: 从 Android 6.0(API 23)开始,
SEND_SMS
权限需要在运行时请求。你可以使用permission_handler
插件来处理运行时权限。 -
短信发送限制: 在某些设备或运营商上,可能会有短信发送的限制。确保你的应用在发送短信时遵守相关法律法规。
处理运行时权限
你可以使用 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!');