我的Flutter一维码,二维码插件已经支持Android,Windows和Web。这篇文章继续添加新的平台:Linux。
Flutter插件下载
https://pub.dev/packages/flutter_barcode_sdk
学习资源
- https://flutter.dev/desktop
- https://github.com/google/flutter-desktop-embedding
- https://github.com/flutter/samples/tree/master/experimental/desktop_photo_search
使用Dart和C++开发Flutter Linux插件
要开发Linux插件,需要把开发平台切换到Linux。我使用统信UOS。
在当前的插件项目中添加Linux插件的模板:
flutter create --template=plugin --platforms=linux .
命令执行之后会生成如下的目录结构:
- include/
- CMakeLists.txt
- flutter_barcode_sdk_plugin.cc
接下来创建一个lib
目录。把下载的Dynamsoft Barcode Reader C++ 压缩包里的*.so
库文件拷贝到目录中。然后在CMakeLists.txt
中配置link_directories
, target_link_libraries
和flutter_barcode_sdk_bundled_libraries
:
cmake_minimum_required(VERSION 3.10)
set(PROJECT_NAME "flutter_barcode_sdk")
project(${PROJECT_NAME} LANGUAGES CXX)
# This value is used when generating builds using this plugin, so it must
# not be changed
set(PLUGIN_NAME "flutter_barcode_sdk_plugin")
link_directories("${PROJECT_SOURCE_DIR}/bin/")
add_library(${PLUGIN_NAME} SHARED
"flutter_barcode_sdk_plugin.cc"
)
apply_standard_settings(${PLUGIN_NAME})
set_target_properties(${PLUGIN_NAME} PROPERTIES
CXX_VISIBILITY_PRESET hidden)
target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL)
target_include_directories(${PLUGIN_NAME} INTERFACE
"${CMAKE_CURRENT_SOURCE_DIR}/include")
target_link_libraries(${PLUGIN_NAME} PRIVATE flutter "DynamsoftBarcodeReader")
target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK)
# List of absolute paths to libraries that should be bundled with the plugin
set(flutter_barcode_sdk_bundled_libraries
"${PROJECT_SOURCE_DIR}/lib/"
PARENT_SCOPE
)
到此,动态链接库的编译链接已经没有问题了,开始写C++代码。打开flutter_barcode_sdk_plugin.cc
找到flutter_barcode_sdk_plugin_handle_method_call()
函数。这里是Dart通向C++的入口。我们先构造基本的接口名判断代码:
static void flutter_barcode_sdk_plugin_handle_method_call(
FlutterBarcodeSdkPlugin* self,
FlMethodCall* method_call) {
g_autoptr(FlMethodResponse) response = nullptr;
const gchar* method = fl_method_call_get_name(method_call);
FlValue* args = fl_method_call_get_args(method_call);
if (strcmp(method, "getPlatformVersion") == 0) {
struct utsname uname_data = {
};
uname(&uname_data);
g_autofree gchar *version = g_strdup_printf("Linux %s. Dynamsoft Barcode Reader version: %s", uname_data.version, self->manager->GetVersion());
g_autoptr(FlValue) result = fl_value_new_string(version);
response = FL_METHOD_RESPONSE(fl_method_success_response_new(result));
}
else if (strcmp(method