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), ); }, ), ); } }
4 Réponses :
importer:
onTap: () {Clipboard.setData(new ClipboardData(text: "your text"));},
Et puis implémentez simplement ceci:
import 'package:flutter/services.dart';
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!
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.
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.
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"))); });
vous devez ajouter import 'package: flutter / services.dart'; pour que cela fonctionne
Vous devez suivre ces étapes:
import 'package:flutter/services.dart';
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