Flutter 3D打印或模型生成插件Polymaker的使用
Flutter 3D打印或模型生成插件Polymaker的使用
Polymaker 是一个用于在 Google 地图上更容易地映射多边形位置的 Flutter 插件。由于其实时显示的功能,特别是在编辑模式下,我们可以准确地知道位置,而无需通过后端系统进行猜测。
Polymaker 只需要一行代码即可运行,并返回位置的 List
值。
工具特性:
- 获取当前位置
- 进入编辑模式
- 关闭编辑模式
- 完成编辑
- 撤销到前一个位置
- 实时多边形以查看结果
- 自定义标记作为指向数字
- 点距离
- 跟踪模式:LINEAR 和 PLANAR
- 自定义地图类型
计费
要使用这些功能,你必须在 Google Cloud 中启用某些 API:
- Google Maps for Android/iOS
设置
ANDROID
在 <strong>android/app/src/main/AndroidManifest.xml</strong>
添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
在 <strong>android/app/src/main/AndroidManifest.xml</strong>
插入 Google Maps Key:
<application
android:name="io.flutter.app.FlutterApplication"
android:label="example"
android:icon="@mipmap/ic_launcher">
.....
<meta-data android:name="com.google.android.geo.API_KEY"
android:value="YOUR API KEY"/>
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
</application>
在 <strong>android/app/build.gradle</strong>
设置你的 SDK 版本为最新:
compileSdkVersion 29
....
defaultConfig {
....
targetSdkVersion 29
....
}
IOS
在应用代理中指定你的 API 密钥(ios/Runner/AppDelegate.m
):
#include "AppDelegate.h"
#include "GeneratedPluginRegistrant.h"
#import "GoogleMaps/GoogleMaps.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GMSServices provideAPIKey:@"YOUR KEY HERE"];
[GeneratedPluginRegistrant registerWithRegistry:self];
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end
或者在 Swift 代码中指定你的 API 密钥(ios/Runner/AppDelegate.swift
):
import UIKit
import Flutter
import GoogleMaps
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?
) -> Bool {
GMSServices.provideAPIKey("YOUR KEY HERE")
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
在应用程序的 Info.plist
文件中添加嵌入视图预览属性,键为 io.flutter.embedded_views_preview
,值为 YES
;同时定义 NSLocationWhenInUseUsageDescription
:
<key>NSLocationWhenInUseUsageDescription</key>
<string>This app needs your location to test the location feature of the Google Maps location picker plugin.</string>
<key>io.flutter.embedded_views_preview</key>
<true/>
如何使用
使用 Polymaker 非常简单,只需要一行代码:
import 'package:polymaker/polymaker.dart' as polymaker;
// 打开 Polymaker 并获取返回的 List<LatLng>
var result = await polymaker.getLocation(context);
getLocation()
的自定义属性
属性名称 | 描述 | 数据类型 |
---|---|---|
toolColor |
自定义工具颜色 | Color |
polygonColor |
自定义多边形颜色 | Color |
iconLocation |
自定义位置图标 | IconData |
iconEditMode |
自定义编辑模式图标 | IconData |
iconCloseEdit |
自定义关闭工具图标 | IconData |
iconDoneEdit |
自定义完成图标 | IconData |
iconUndoEdit |
自定义撤销图标 | IconData |
iconGPSPoint |
使用 GPS 数据作为跟踪点 | IconData |
autoEditMode |
自动启用编辑模式 | Boolean |
pointDistance |
启用/禁用点距离 | Boolean |
trackingMode |
选择跟踪模式:多边形或折线 | TrackingMode |
targetCameraPosition |
设置初始相机位置 | LatLng |
enableDragMarker |
启用拖动标记位置 | Boolean |
示例代码
以下是一个完整的示例代码,展示了如何使用 Polymaker 插件:
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:polymaker/core/models/trackingmode.dart';
import 'package:polymaker/polymaker.dart' as polymaker;
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'PolyMaker Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomeScreen(),
);
}
}
class HomeScreen extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("PolyMaker Demo"),
),
body: HomeBody(),
);
}
}
class HomeBody extends StatefulWidget {
[@override](/user/override)
_HomeBodyState createState() => _HomeBodyState();
}
class _HomeBodyState extends State<HomeBody> {
List<LatLng>? locationList;
void getLocation() async {
var result = await polymaker.getLocation(
context,
trackingMode: TrackingMode.PLANAR,
enableDragMarker: true,
);
if (result != null) {
setState(() {
locationList = result;
});
}
}
[@override](/user/override)
void initState() {
super.initState();
locationList = [];
}
[@override](/user/override)
Widget build(BuildContext context) {
return Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
"Location Result: \n" +
(locationList != null
? locationList!
.map((val) => "[${val.latitude}, ${val.longitude}]\n")
.toString()
: ""),
textAlign: TextAlign.center,
style: TextStyle(fontSize: 18),
),
SizedBox(height: 10),
Container(
height: 45,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
primary: Colors.blue,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10)),
),
onPressed: () => getLocation(),
child: Text(
"Get Polygon Location",
style: TextStyle(fontSize: 16, color: Colors.white),
),
),
),
],
),
);
}
}
更多关于Flutter 3D打印或模型生成插件Polymaker的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter 3D打印或模型生成插件Polymaker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,直接操作3D打印或模型生成功能并不常见,因为Flutter主要是用于构建跨平台的移动应用UI。然而,你可以通过调用原生平台(如Android和iOS)的特定库或插件来实现这些功能。对于Polymaker这样的3D打印软件,虽然它没有直接的Flutter插件,但你可以通过平台通道(Platform Channels)与原生代码进行交互。
以下是一个基本的示例,展示了如何在Flutter中设置平台通道来调用原生平台的3D打印或模型生成功能。注意,这里不会具体实现Polymaker的所有功能,而是展示如何通过平台通道与原生代码交互。
1. 在Flutter中设置平台通道
首先,在Flutter项目中创建一个平台通道。
import 'package:flutter/services.dart';
class PolymakerPlugin {
static const MethodChannel _channel = const MethodChannel('com.example.polymaker_plugin');
// 调用原生平台生成模型的方法
static Future<String?> generateModel(String modelData) async {
try {
final String? result = await _channel.invokeMethod('generateModel', modelData);
return result;
} on PlatformException catch (e) {
print("Failed to generate model: '${e.message}'.");
return null;
}
}
// 调用原生平台打印模型的方法
static Future<void> printModel(String modelPath) async {
try {
await _channel.invokeMethod('printModel', modelPath);
} on PlatformException catch (e) {
print("Failed to print model: '${e.message}'.");
}
}
}
2. 在Android平台上实现原生方法
在android/app/src/main/kotlin/.../MainActivity.kt
(或Java对应文件)中,实现平台通道的方法。这里假设你有一个Android库或SDK可以与Polymaker交互(实际上,你可能需要直接调用Polymaker的API或通过某种方式与其集成,但这通常涉及更复杂的设置,并且可能不在Flutter插件的常规范围内)。
package com.example.your_app_name
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
class MainActivity: FlutterActivity() {
private val CHANNEL = "com.example.polymaker_plugin"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
if (call.method == "generateModel") {
val modelData = call.argument<String>("modelData") ?: ""
// 这里实现生成模型的逻辑,可能涉及调用Polymaker的API或相关库
val generatedModelPath = generateModelInPolymaker(modelData)
result.success(generatedModelPath)
} else if (call.method == "printModel") {
val modelPath = call.argument<String>("modelPath") ?: ""
// 这里实现打印模型的逻辑,可能涉及调用Polymaker的打印功能
printModelInPolymaker(modelPath)
result.success(null)
} else {
result.notImplemented()
}
}
}
// 假设的方法,用于生成模型(需要实际实现)
private fun generateModelInPolymaker(modelData: String): String {
// TODO: 实现与Polymaker的集成来生成模型
return "path/to/generated/model.stl"
}
// 假设的方法,用于打印模型(需要实际实现)
private fun printModelInPolymaker(modelPath: String) {
// TODO: 实现与Polymaker的集成来打印模型
}
}
3. 在iOS平台上实现原生方法
在ios/Runner/AppDelegate.swift
(或Objective-C对应文件)中,实现平台通道的方法。同样,这里假设你有一个iOS库或框架可以与Polymaker交互。
import UIKit
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let channel = FlutterMethodChannel(name: "com.example.polymaker_plugin", binaryMessenger: controller.binaryMessenger)
channel.setMethodCallHandler({
(call: FlutterMethodCall, result: @escaping FlutterResult) in
if call.method == "generateModel" {
guard let modelData = call.arguments as? String else {
result(FlutterError(code: "INVALID_ARGUMENT", message: "Model data is missing", details: nil))
return
}
let generatedModelPath = self.generateModelInPolymaker(modelData: modelData)
result(generatedModelPath)
} else if call.method == "printModel" {
guard let modelPath = call.arguments as? String else {
result(FlutterError(code: "INVALID_ARGUMENT", message: "Model path is missing", details: nil))
return
}
self.printModelInPolymaker(modelPath: modelPath)
result(())
} else {
result(FlutterMethodNotImplementedError(methodName: call.method))
}
})
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
// 假设的方法,用于生成模型(需要实际实现)
private func generateModelInPolymaker(modelData: String) -> String {
// TODO: 实现与Polymaker的集成来生成模型
return "path/to/generated/model.stl"
}
// 假设的方法,用于打印模型(需要实际实现)
private func printModelInPolymaker(modelPath: String) {
// TODO: 实现与Polymaker的集成来打印模型
}
}
注意
- 上面的代码仅作为示例,展示了如何通过平台通道在Flutter与原生平台之间传递数据。
generateModelInPolymaker
和printModelInPolymaker
方法需要实际实现,这可能涉及调用Polymaker的API或相关库。由于Polymaker可能是一个桌面应用而非移动库,因此直接在移动设备上集成可能比较复杂,可能需要通过一些间接方式(如网络请求、文件传输等)来实现交互。- 在实际项目中,还需要处理更多的错误情况、权限请求等。
希望这个示例能帮助你理解如何在Flutter中通过平台通道与原生平台交互,进而实现与Polymaker或其他3D打印软件的集成。