flutter 使用vs编辑windows插件

  1. 创建插件
mkdir win_test && cd win_test
flutter create -t plugin --platforms windows ./
  1. 找到win_test\example\build\windows\plugins\win_test\win_test_plugin.sln使用vs打开编辑

  2. win_test\lib\win_test.dart中编写Dart Api

一个函数示例

win_test.dart:

class WinTest {
  static const MethodChannel _channel = const MethodChannel('win_test');

  ///
  ///## Example
  ///```dart
  ///print( await WinTest.hello("hello world", "msg", 0) );
  ///```
  ///
  static Future<int> hello(String content, String title, int uType) async {
    return await _channel.invokeMethod('hello', [content, title, uType]);
  }
}

win_test_plugin.cpp:

#include <iostream>

using namespace std;

void WinTestPlugin::HandleMethodCall(
    const flutter::MethodCall<flutter::EncodableValue> &method_call,
    unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {

  if ( method_call.method_name().compare("hello") == 0 )
  {
    const auto* arguments = get_if<flutter::EncodableList>(method_call.arguments());
    if (!arguments)
    {
      result->Error(0);
      return;
    }

    auto lpText = arguments->at(0);
    auto lpCaption = arguments->at(1);
    auto uType = arguments->at(2);
    result->Success(
      MessageBoxA(0, get<string>(lpText).c_str(), get<string>(lpCaption).c_str(), get<int>(uType))
    );
  }
  result->NotImplemented();
}

处理单个参数

_channel.invokeMethod('hello', 10);
auto* uFlags = get_if<int>(mc.arguments());

发送map返回list

    print(await _channel.invokeMethod(
      'hello',
      {'a': 1, 'b': 'hello world'},
    )); // [1, hello world]
    auto* arguments = get_if<flutter::EncodableMap>(method_call.arguments());
    if (!arguments)
    {
      result->Error("arguments error");
      return;
    }
    auto* a = get_if<int>(&(arguments->find(flutter::EncodableValue("a"))->second));
    auto* b = get_if<string>(&(arguments->find(flutter::EncodableValue("b"))->second));

    auto r =  flutter::EncodableList();
    r.push_back( *a );
    r.push_back( *b );
    result->Success(r);

返回Map

    print(
      await _channel.invokeMethod(
      'hello',
      {'a': 1, 'b': 'hello world'},
    )
    ); //  {a_v: 1, b_v: hello world}
    auto* arguments = get_if<flutter::EncodableMap>(method_call.arguments());
    if (!arguments)
    {
      result->Error("arguments error");
      return;
    }
    auto* a = get_if<int>(&(arguments->find(flutter::EncodableValue("a"))->second));
    auto* b = get_if<string>(&(arguments->find(flutter::EncodableValue("b"))->second));

    auto r = flutter::EncodableMap::map();
    r.insert(pair<flutter::EncodableValue, flutter::EncodableValue>(flutter::EncodableValue("a_v"), *a));
    r.insert(pair<flutter::EncodableValue, flutter::EncodableValue>(flutter::EncodableValue("b_v"), flutter::EncodableValue(b->c_str())));
    result->Success( r );
posted @ 2020-09-30 15:40  Ajanuw  阅读(770)  评论(0编辑  收藏  举报