
Adds initial support for flutter create of apps and plugins. This is derived from the current FDE example app and sample plugin, adding template values where relevant. Since the APIs/tooling/template aren't stable yet, the app template includes a version marker, which will be updated each time there's a breaking change. The build now checks that the template version matches the version known by that version of the tool, and gives a specific error message when there's a mismatch, which improves over the current breaking change experience of hitting whatever build failure the breaking change causes and having to figure out that the problem is that the runner is out of date. It also adds a warning to the create output about the fact that it won't be stable. Plugins don't currently have a version marker since in practice this is not a significant problem for plugins yet the way it is for runners; we can add it later if that changes. Fixes #30704
96 lines
3.1 KiB
Cheetah
96 lines
3.1 KiB
Cheetah
#include "{{projectName}}_plugin.h"
|
|
|
|
// This must be included before many other Windows headers.
|
|
#include <windows.h>
|
|
|
|
// For getPlatformVersion; remove unless needed for your plugin implementation.
|
|
#include <VersionHelpers.h>
|
|
|
|
#include <flutter/method_channel.h>
|
|
#include <flutter/plugin_registrar_windows.h>
|
|
#include <flutter/standard_method_codec.h>
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <sstream>
|
|
|
|
namespace {
|
|
|
|
class {{pluginClass}} : public flutter::Plugin {
|
|
public:
|
|
static void RegisterWithRegistrar(flutter::PluginRegistrarWindows *registrar);
|
|
|
|
{{pluginClass}}();
|
|
|
|
virtual ~{{pluginClass}}();
|
|
|
|
private:
|
|
// Called when a method is called on this plugin's channel from Dart.
|
|
void HandleMethodCall(
|
|
const flutter::MethodCall<flutter::EncodableValue> &method_call,
|
|
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
|
|
};
|
|
|
|
// static
|
|
void {{pluginClass}}::RegisterWithRegistrar(
|
|
flutter::PluginRegistrarWindows *registrar) {
|
|
auto channel =
|
|
std::make_unique<flutter::MethodChannel<flutter::EncodableValue>>(
|
|
registrar->messenger(), "{{projectName}}",
|
|
&flutter::StandardMethodCodec::GetInstance());
|
|
|
|
auto plugin = std::make_unique<{{pluginClass}}>();
|
|
|
|
channel->SetMethodCallHandler(
|
|
[plugin_pointer = plugin.get()](const auto &call, auto result) {
|
|
plugin_pointer->HandleMethodCall(call, std::move(result));
|
|
});
|
|
|
|
registrar->AddPlugin(std::move(plugin));
|
|
}
|
|
|
|
{{pluginClass}}::{{pluginClass}}() {}
|
|
|
|
{{pluginClass}}::~{{pluginClass}}() {}
|
|
|
|
void {{pluginClass}}::HandleMethodCall(
|
|
const flutter::MethodCall<flutter::EncodableValue> &method_call,
|
|
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
|
|
// Replace "getPlatformVersion" check with your plugin's method.
|
|
// See:
|
|
// https://github.com/flutter/engine/tree/master/shell/platform/common/cpp/client_wrapper/include/flutter
|
|
// and
|
|
// https://github.com/flutter/engine/tree/master/shell/platform/glfw/client_wrapper/include/flutter
|
|
// for the relevant Flutter APIs.
|
|
if (method_call.method_name().compare("getPlatformVersion") == 0) {
|
|
std::ostringstream version_stream;
|
|
version_stream << "Windows ";
|
|
if (IsWindows10OrGreater()) {
|
|
version_stream << "10+";
|
|
} else if (IsWindows8OrGreater()) {
|
|
version_stream << "8";
|
|
} else if (IsWindows7OrGreater()) {
|
|
version_stream << "7";
|
|
}
|
|
flutter::EncodableValue response(version_stream.str());
|
|
result->Success(&response);
|
|
} else {
|
|
result->NotImplemented();
|
|
}
|
|
}
|
|
|
|
} // namespace
|
|
|
|
void {{pluginClass}}RegisterWithRegistrar(
|
|
FlutterDesktopPluginRegistrarRef registrar) {
|
|
// The plugin registrar wrappers owns the plugins, registered callbacks, etc.,
|
|
// so must remain valid for the life of the application.
|
|
static auto *plugin_registrars =
|
|
new std::map<FlutterDesktopPluginRegistrarRef,
|
|
std::unique_ptr<flutter::PluginRegistrarWindows>>;
|
|
auto insert_result = plugin_registrars->emplace(
|
|
registrar, std::make_unique<flutter::PluginRegistrarWindows>(registrar));
|
|
|
|
{{pluginClass}}::RegisterWithRegistrar(insert_result.first->second.get());
|
|
}
|