Flutter - Как использовать условную компиляцию для платформы (Android, iOS, Web)? - PullRequest
1 голос
/ 08 мая 2020

Я создаю мобильное приложение на Flutter. Теперь у меня проблема, для одной платформы я буду использовать плагин для другой, мне нужно написать код своей платформы (реализация плагина не подходит).

Вижу несколько решений:

  1. Было бы оптимально создать несколько проектов и использовать в них условную компиляцию и общие файлы. Я использовал эту технику в visual studio. но сейчас я использую студию android. файла проекта нет, только папки.

    Также проблема с поддержкой условной компиляции. Я нашел эту статью , и условная компиляция очень ограничена.

  2. создайте свой собственный плагин и используйте его полностью. но это более трудозатратно.

    Что посоветуете, может есть третий способ?

Ответы [ 3 ]

3 голосов
/ 08 мая 2020
• 1000

Например, у одного может быть плагин, структурированный следующим образом:

- my_plugin_io.dart
- my_plugin_web.dart
- my_plugin_stub.dart
- my_plugin.dart

Давайте разберем его на простом примере:

my_plugin.dart

Здесь вы можете использовать класс вашего плагина в нескольких проектах (ie. Среды).

import 'my_plugin_stub.dart'
    if (dart.library.io) 'my_plugin_io.dart'
    if (dart.library.html) 'my_plugin_web.dart';

class MyPlugin {

  void foo() {
     var bar = myPluginMethod(); // it will either resolve for the web or io implementation at compile time
  }
}

my_plugin_stub.dart

Это то, что на самом деле разрешится во время компиляции ( заглушка ) справа myPluginMethod() метод.

Object myPluginMethod() {
  throw UnimplementedError('Unsupported');
}

А затем создайте реализации платформы

my_plugin_web.dart

import 'dart:html' as html;

Object myPluginMethod() {
  // Something that use dart:html data for example
}

my_plugin_io.dart

import 'dart:io';

Object myPluginMethod() {
  // Something that use dart:io data for example
}

Другие официальные альтернативы могут пройти от создания отдельных проектов с одним и тем же интерфейсом. Это похоже на то, что команда Flutter сделала для своих плагинов web + io, в результате чего получился проект, который можно объединить с несколькими проектами:

- my_plugin_io
- my_plugin_web
- my_plugin_desktop
- my_plugin_interface

Хорошую статью, объясняющую это, можно найти здесь .

Просто набрал его прямо здесь, в SO, извините, если у меня была опечатка, но вы легко найдете ее в редакторе.

0 голосов
/ 29 июля 2020

Вам просто нужно импортировать:

import 'dart:io';

А затем использовать условные выражения на основе:

// Platform.isIOS       // Returns true on iOS devices
// Platform.isAndroid   // Returns true on Android devices


if (Platform.isIOS) {
  navigationBar = new BottomNavigationBar(...);
}
if (Platform.isAndroid) {
  drawer = new Drawer(...);
}
0 голосов
/ 08 мая 2020

Добавьте эту библиотеку (пакет не требуется)

import 'dart:io' show Platform;

Теперь вы можете создать функцию, которая проверяет, какую платформу использует пользователь.

Widget getWidgetBasedOnPlatform() {
  if (Platform.isIOS) {
    return Container(); //the one for iOS
  }
  else if (Platform.isAndroid) {
    return Container(); //the one for Android 
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...