@@ -99,6 +99,21 @@ class ELinuxPlugin extends PluginPlatform implements NativeOrDartPlugin {
99
99
}
100
100
101
101
String get path => directory.parent.path;
102
+
103
+ /// Method to return a detailed debug string for the plugin.
104
+ @override
105
+ String toString () {
106
+ return '''
107
+ ELinuxPlugin:
108
+ name: $name
109
+ directory: ${directory .path }
110
+ pluginClass: $pluginClass
111
+ dartPluginClass: $dartPluginClass
112
+ ffiPlugin: $ffiPlugin
113
+ defaultPackage: $defaultPackage
114
+ dependencies: ${dependencies ?.join (', ' )}
115
+ ''' ;
116
+ }
102
117
}
103
118
104
119
/// Source: [_internalCapitalLetterRegex] in `platform_plugins.dart` (exact copy)
@@ -426,12 +441,20 @@ Future<List<ELinuxPlugin>> findELinuxPlugins(
426
441
final ELinuxPlugin ? plugin = _pluginFromPackage (package.name, packageRoot);
427
442
if (plugin == null ) {
428
443
continue ;
429
- } else if (nativeOnly &&
430
- (plugin.pluginClass == null || plugin.pluginClass == 'none' )) {
444
+ }
445
+
446
+ final bool isFfi = plugin.ffiPlugin ?? false ;
447
+
448
+ if (nativeOnly &&
449
+ ((plugin.pluginClass == null || plugin.pluginClass == 'none' ) &&
450
+ ! isFfi)) {
431
451
continue ;
432
- } else if (dartOnly && plugin.dartPluginClass == null ) {
452
+ }
453
+
454
+ if (dartOnly && (plugin.dartPluginClass == null || isFfi)) {
433
455
continue ;
434
456
}
457
+
435
458
plugins.add (plugin);
436
459
}
437
460
return plugins;
@@ -513,18 +536,47 @@ void registerPlugins() {
513
536
);
514
537
}
515
538
539
+ /// Filters out any plugins that don't use method channels, and thus shouldn't be added to the native generated registrants.
540
+ List <ELinuxPlugin > _filterMethodChannelPlugins (List <ELinuxPlugin > plugins) {
541
+ return plugins.where ((ELinuxPlugin plugin) {
542
+ return (plugin as NativeOrDartPlugin ).hasMethodChannel ();
543
+ }).toList ();
544
+ }
545
+
546
+ /// Filters out Dart-only and method channel plugins.
547
+ ///
548
+ /// FFI plugins do not need native code registration, but their binaries need to be bundled.
549
+ List <ELinuxPlugin > _filterFfiPlugins (List <ELinuxPlugin > plugins) {
550
+ return plugins.where ((ELinuxPlugin plugin) {
551
+ final NativeOrDartPlugin plugin_ = plugin as NativeOrDartPlugin ;
552
+ return plugin_.hasFfi ();
553
+ }).toList ();
554
+ }
555
+
516
556
/// See: [_writeWindowsPluginFiles] in `plugins.dart`
517
557
void _writePluginCmakefileTemplate (
518
558
ELinuxProject eLinuxProject,
519
559
Directory registryDirectory,
520
560
List <ELinuxPlugin > plugins,
521
561
) {
522
- final List <Map <String , dynamic >> pluginConfigs =
523
- plugins.map ((ELinuxPlugin plugin) => plugin.toMap ()).toList ();
562
+ final List <ELinuxPlugin > methodChannelPlugins =
563
+ _filterMethodChannelPlugins (plugins);
564
+ final List <ELinuxPlugin > ffiPlugins = _filterFfiPlugins (plugins)
565
+ ..removeWhere (methodChannelPlugins.contains);
566
+
567
+ final List <Map <String , dynamic >> methodChannelPluginsMap =
568
+ methodChannelPlugins
569
+ .map ((ELinuxPlugin plugin) => plugin.toMap ())
570
+ .toList ();
571
+ final List <Map <String , dynamic >> ffiPluginsMap =
572
+ ffiPlugins.map ((ELinuxPlugin plugin) => plugin.toMap ()).toList ();
573
+
524
574
final Map <String , dynamic > context = < String , dynamic > {
525
- 'plugins' : pluginConfigs,
575
+ 'methodChannelPlugins' : methodChannelPluginsMap,
576
+ 'ffiPlugins' : ffiPluginsMap,
526
577
'pluginsDir' : _cmakeRelativePluginSymlinkDirectoryPath (eLinuxProject),
527
578
};
579
+
528
580
_renderTemplateToFile (
529
581
'''
530
582
//
@@ -547,22 +599,22 @@ void RegisterPlugins(flutter::PluginRegistry* registry);
547
599
_renderTemplateToFile (
548
600
'''
549
601
//
550
- // Generated file. Do not edit.
602
+ // Generated file. Do not edit.
551
603
//
552
604
553
605
// clang-format off
554
606
555
607
#include "generated_plugin_registrant.h"
556
608
557
- {{#plugins }}
609
+ {{#methodChannelPlugins }}
558
610
#include <{{name}}/{{filename}}.h>
559
- {{/plugins }}
611
+ {{/methodChannelPlugins }}
560
612
561
613
void RegisterPlugins(flutter::PluginRegistry* registry) {
562
- {{#plugins }}
614
+ {{#methodChannelPlugins }}
563
615
{{class}}RegisterWithRegistrar(
564
616
registry->GetRegistrarForPlugin("{{class}}"));
565
- {{/plugins }}
617
+ {{/methodChannelPlugins }}
566
618
}
567
619
''' ,
568
620
context,
@@ -575,9 +627,15 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
575
627
#
576
628
577
629
list(APPEND FLUTTER_PLUGIN_LIST
578
- {{#plugins }}
630
+ {{#methodChannelPlugins }}
579
631
{{name}}
580
- {{/plugins}}
632
+ {{/methodChannelPlugins}}
633
+ )
634
+
635
+ list(APPEND FLUTTER_FFI_PLUGIN_LIST
636
+ {{#ffiPlugins}}
637
+ {{name}}
638
+ {{/ffiPlugins}}
581
639
)
582
640
583
641
set(PLUGIN_BUNDLED_LIBRARIES)
@@ -588,6 +646,11 @@ foreach(plugin ${FLUTTER_PLUGIN_LIST})
588
646
list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
589
647
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
590
648
endforeach(plugin)
649
+
650
+ foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
651
+ add_subdirectory({{pluginsDir}}/${ffi_plugin}/elinux plugins/${ffi_plugin})
652
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
653
+ endforeach(ffi_plugin)
591
654
''' ,
592
655
context,
593
656
registryDirectory.childFile ('generated_plugins.cmake' ).path,
0 commit comments