201 votes

Flutter (Dart) Comment ajouter la fonction de copie du presse-papiers à une application ?

Je suis un débutant de Flutter et je viens de commencer à suivre leur tutoriel d'application de génération de noms et j'ai fait une simple application de génération de noms. Je me demande s'il est possible d'ajouter la fonction de copie dans le presse-papiers lorsqu'un utilisateur tape sur un nom ? J'ai essayé d'implémenter une solution que j'ai trouvée sur stack mais ça n'a pas marché. 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),
          );

        },
      ),
    );
  }
}

505voto

Houssem Points 2322

L'importation :

import 'package:flutter/services.dart';

Et ensuite, il suffit de mettre cela en œuvre :

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

9 votes

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

73voto

Ron Shoshani Points 43

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

import 'package:flutter/services.dart';

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

Il y a eu des changements importants qui pourraient vous être utiles dans le lien suivant : https://docs.flutter.dev/release/breaking-changes/scaffold-messenger

9 votes

L'affichage du snackbar dans Scaffold est déprécié, vous devriez utiliser ScaffoldMessenger. ScaffoldMessenger.of(context) .showSnackBar(SnackBar( content : Texte("Votre texte")) ) ;

27voto

MohanKumar Points 494

Vous pouvez utiliser le code ci-dessous sans ajouter de plugins et notifier l'utilisateur :

Notification de l'utilisateur par Scaffold.of(context).showSnackBar(snackBar); est déprécié utilisez donc le code mis à jour ci-dessous.

import 'package:flutter/services.dart';

Clipboard.setData(new ClipboardData(text: "Your Copy text")).then((_){
   ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text('Copied to your clipboard !')));
});

12voto

Doodles Points 189

Vous pouvez utiliser le paquetage Flutter clipboard_manager : Gestionnaire de presse-papiers Flutter

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

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

Où "votre texte à copier" peut être remplacé par toute chaîne de caractères que vous souhaitez copier dans le presse-papiers.

Si vous voulez créer un snackbar après avoir copié le texte, puisque c'est asynchrone, vous pouvez le faire :

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);
                      });

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

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

Cependant, je trouve que le supplément de sucre syntaxique et l'avantage d'être asynchrone en font une meilleure solution, rien que vous ne puissiez faire avec Flutter vanille, mais je la trouve un peu meilleure.

36 votes

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

6 votes

Il y a déjà une grande question ouverte 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 comme dépendance - et avoir construit l'application en mode release - la tâche suivante échoue - 'verifyReleaseResources' - cela signifie simplement - qu'il y a du code vulnérable détecté dans la bibliothèque. Flutter dispose d'une fonction de presse-papiers intégrée - préférez-la.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X