Как реализовать Плагин Архитектура в Flutter Dart - PullRequest
0 голосов
/ 12 октября 2019

Я хочу реализовать архитектуру плагинов во Flutter Dart. Процесс будет следующим: 1. Пользователь загружает приложение. 2. Пользователь загружает плагины с нашего сайта. 3. Приложения смотрят, реализует ли плагин интерфейс. 4. Если интерфейс реализован, загрузите информацию и виджеты из плагина в приложение.

Я реализовал тот же процесс в C #, используя загрузку скомпилированной DLL во время выполнения, но не смог найти ее для Flutter.

Я изучил некоторые из предыдущих вопросов и ресурсов, доступных в Интернете, и самым близким из них я нашел, https://pub.dev/packages/plugins, но плагин не поддерживается в Dart 2 и устарел

Это был код, который я реализовал в C #.

            int i = 0;

            if (Directory.Exists("Plugins"))
            {
                dllFileNames = Directory.GetFiles("Plugins", "*.dll");

                ICollection<Assembly> assemblies = new List<Assembly>(dllFileNames.Length);
                foreach (string dllFile in dllFileNames)
                {
                    AssemblyName an = AssemblyName.GetAssemblyName(dllFile);
                    Assembly assembly = Assembly.Load(an);
                    assemblies.Add(assembly);
                }

                Type pluginType = typeof(IPlugin);
                List<Type> pluginTypes = new List<Type>();
                foreach (Assembly assembly in assemblies)
                {
                    if (assembly != null)
                    {
                        Type[] types = assembly.GetTypes();
                        foreach (Type type in types)
                        {
                            if (type.IsInterface || type.IsAbstract)
                            {
                                continue;
                            }
                            else if (pluginType.IsAssignableFrom(type))
                            {
                                pluginTypes.Add(type);
                            }
                        }
                    }

                    i++;
                }

                ICollection<IPlugin> plugins = new List<IPlugin>(pluginTypes.Count);
                foreach (Type type in pluginTypes)
                {
                    IPlugin plugin = (IPlugin)Activator.CreateInstance(type);
                    plugin.Initiate();
                    plugins.Add(plugin);
                }

                return plugins;
            }

            return null;

1 Ответ

0 голосов
/ 18 октября 2019

Это, вероятно, невозможно.

Часть компиляции AOT, подготавливающая ваше приложение к загрузке в магазины, потрясает деревьями, удаляя все, что не нужно в текущей сборке. Итак, все, что понадобится вашему плагину для вызова, пропало.

...