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

1 回复

更多关于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与原生平台之间传递数据。
  • generateModelInPolymakerprintModelInPolymaker方法需要实际实现,这可能涉及调用Polymaker的API或相关库。由于Polymaker可能是一个桌面应用而非移动库,因此直接在移动设备上集成可能比较复杂,可能需要通过一些间接方式(如网络请求、文件传输等)来实现交互。
  • 在实际项目中,还需要处理更多的错误情况、权限请求等。

希望这个示例能帮助你理解如何在Flutter中通过平台通道与原生平台交互,进而实现与Polymaker或其他3D打印软件的集成。

回到顶部