Флаттер не может читать из буфера обмена - PullRequest
0 голосов
/ 20 ноября 2018

Я пришел задавать довольно конкретный вопрос о Flutter и Future и механизме ожидания, который, кажется, работает, но мой буфер обмена не работает, работая с моими редактируемыми текстовыми полями, даже следуя советам Google по внедрению ...

Это мой код для вставки:

onPressed: () async {
  await getMyData('text');
  _encodingController.text = clipData;
  Scaffold.of(context).showSnackBar(
    new SnackBar(
      content: new Text(
        "Pasted from Clipboard"),
      ),
    );
},

не работает моя функция вставки ... Во время отладки результат этой следующей функции равен null, wth ?????????

static Future<ClipboardData> getMyData(String format) async {
    final Map<String, dynamic> result =
        await SystemChannels.platform.invokeMethod(
      'Clipboard.getData',
      format,
    );

    if (result == null) {
      return null;
    } else {
      clipData = ClipboardData(text: result['text']).text;
      return ClipboardData(text: result['text'].text);
    }
  }

Я, вероятно, использую фьючерсы и асинхронные, ожидаю неправильно, хотел бы получить некоторое руководство !!!Копирование работает с помощью плагина Clipboard Manager!Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Или вы можете просто использовать базовый способ Флаттера:

ClipboardData data = await Clipboard.getData('text/plain');

Это работает как шарм.

0 голосов
/ 09 апреля 2019

Также может быть полезно, если вы хотите прослушивать периодические обновления из системного буфера обмена. Первоначально я ответил здесь , просто повторно опубликовав решение:

#creating a listening Stream:
final clipboardContentStream = StreamController<String>.broadcast();

#creating a timer for updates:
Timer clipboardTriggerTime;

clipboardTriggerTime = Timer.periodic(
# you can specify any duration you want, roughly every 20 read from the system
      const Duration(seconds: 5),
      (timer) {
        Clipboard.getData('text/plain').then((clipboarContent) {
          print('Clipboard content ${clipboarContent.text}');

          # post to a Stream you're subscribed to
          clipboardContentStream.add(clipboarContent.text);
        });
      },
    );

# subscribe your view with
Stream get clipboardText => clipboardController.stream

# and don't forget to clean up on your widget
@override
void dispose() {
  clipboardContentStream.close();

  clipboardTriggerTime.cancel();
}
0 голосов
/ 14 января 2019

Это работает для меня:

  _getFromClipboard() async {
    Map<String, dynamic> result =
        await SystemChannels.platform.invokeMethod('Clipboard.getData');
    if (result != null) {
      return result['text'].toString();
    }
    return '';
  }
...