27
votes

Flutter (Dart) Comment ajouter une copie au presse-papiers en appuyant sur une application?

Je suis un débutant dans Flutter et je viens de commencer à suivre leur tutoriel sur l'application Name Generator et à créer une application de génération de nom simple. Je me demande s'il est possible d'ajouter la fonction de copie dans le presse-papiers lorsqu'un utilisateur appuie sur un nom? J'ai essayé d'implémenter une solution que j'ai trouvée sur la pile mais cela n'a pas fonctionné. Mon code complet est ici. Tout conseil est apprécié.

import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Startup Name Generator',
      home: new RandomWords(),
    );
  }
}

class RandomWords extends StatefulWidget {
  @override
  RandomWordsState createState() => new RandomWordsState();
}

class RandomWordsState extends State<RandomWords> {
  final List<WordPair> _suggestions = <WordPair>[];
  final Set<WordPair> _saved = new Set<WordPair>();
  final TextStyle _biggerFont = const TextStyle(fontSize: 18.0);

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: const Text('Startup Name Generator'),
        actions: <Widget>[
          new IconButton(icon: const Icon(Icons.list), onPressed: _pushSaved),
        ],
      ),
      body: _buildSuggestions(),
    );
  }

  Widget _buildSuggestions() {
    return new ListView.builder(
        padding: const EdgeInsets.all(16.0),
        itemBuilder: (BuildContext _context, int i) {
          if (i.isOdd) {
            return const Divider();
          }
          final int index = i ~/ 2;
          if (index >= _suggestions.length) {
            _suggestions.addAll(generateWordPairs().take(10));
          }
          return _buildRow(_suggestions[index]);
        });
  }

  Widget _buildRow(WordPair pair) {
    final bool alreadySaved = _saved.contains(pair);

    return new ListTile(
      title: new Text(
        pair.asPascalCase,
        style: _biggerFont,
      ),
      trailing: new Icon(
        alreadySaved ? Icons.favorite : Icons.favorite_border,
        color: alreadySaved ? Colors.red : null,
      ),
      onTap: () {
        setState(() {
          if (alreadySaved) {
            _saved.remove(pair);
          } else {
            _saved.add(pair);
          }
        });
      },
    );
  }

  void _pushSaved() {
    Navigator.of(context).push(
      new MaterialPageRoute<void>(
        builder: (BuildContext context) {
          final Iterable<ListTile> tiles = _saved.map(
                (WordPair pair) {
              return new ListTile(
                title: new Text(
                  pair.asPascalCase,
                  style: _biggerFont,
                ),
              );
            },
          );
          final List<Widget> divided = ListTile
              .divideTiles(
            context: context,
            tiles: tiles,
          )
              .toList();
          return new Scaffold(
            appBar: new AppBar(
              title: const Text('Saved Suggestions'),
            ),
            body: new ListView(children: divided),
          );

        },
      ),
    );
  }
}


0 commentaires

4 Réponses :


91
votes

importer:

onTap: () {Clipboard.setData(new ClipboardData(text: "your text"));},

Et puis implémentez simplement ceci:

import 'package:flutter/services.dart';


4 commentaires

N'est-ce pas plus simple sans aucune dépendance?


Cela devrait être sélectionné comme la bonne réponse - nous devrions toujours préférer les fonctions système aux bibliothèques externes


D'accord, cela aurait dû être accepté comme la bonne réponse.


Je pense que le mot «nouveau» n'est pas nécessaire. Meilleure réponse, merci!



9
votes

Vous pouvez utiliser le package Flutter clipboard_manager : Flutter clipboard manager

Pour l'installer, suivez les instructions de cette page, assez simples: Processus d'installation du gestionnaire de presse-papiers Flutter

Pour l'utiliser, importez-le dans le fichier .dart que vous écrivez et vous pouvez ensuite utiliser ceci: ClipboardManager.copyToClipBoard("your text to copy")

Où «votre texte à copier» peut être remplacé par n'importe quelle chaîne que vous souhaitez copier dans le presse-papiers.

Si vous souhaitez créer un snack après avoir copié le texte, comme il est asynchrone, vous pouvez faire:

Clipboard.setData(new ClipboardData(text: "your text to copy"));

Adendum: Si vous regardez le code source du paquet, voici ce qu'il fait essentiellement:

ClipboardManager.copyToClipBoard("your text to copy").then((result) {
                        final snackBar = SnackBar(
                          content: Text('Copied to Clipboard'),
                          action: SnackBarAction(
                            label: 'Undo',
                            onPressed: () {},
                          ),
                        );
                        Scaffold.of(context).showSnackBar(snackBar);
                      });

Cependant, je trouve que le peu plus de sucre syntaxique et l'avantage d'être asynchrone en font une meilleure solution, rien que vous ne pouvez faire avec vanilla Flutter, mais je le trouve un peu mieux.


2 commentaires

Pourquoi installer un plugin! Une autre réponse est plus simple, en utilisant 'package:flutter/services.dart'


Il y a déjà un gros problème ouvert pour cette bibliothèque - github.com/anuranBarman/ClipboardManager/issues/13 Je ne décourage pas l'utilisation de cette bibliothèque - mais après l'avoir ajoutée en tant que dépendance - et la construction de l'application en mode version - la tâche suivante échoue - 'verifyReleaseResources' - cela signifie simplement qu'il y a un code vulnérable détecté dans la bibliothèque. Flutter a une fonction de presse-papiers intégrée - préférez cela.



6
votes

Si vous voulez une meilleure solution sans aucune dépendance qui fonctionne de manière asynchrone, utilisez ceci:

 Clipboard.setData(new ClipboardData(text: email)).then((_){
          Scaffold.of(context).showSnackBar(      
          SnackBar(content:Text("Email address copied to clipboard")));
    });


1 commentaires

vous devez ajouter import 'package: flutter / services.dart'; pour que cela fonctionne



0
votes

Vous devez suivre ces étapes:

  1. import 'package:flutter/services.dart';
  2. await Clipboard.setData(ClipboardData(text: 'text_to_copy'));

await est utilisé comme setData() est une async fonction et le code fonctionnera bien , mais sans façon asynchrone await keyqord


0 commentaires