je veux passer une fonction via le constructeur à mon textformfield
personnalisé ce que je vais écrire dans la propriété de classe et la fonction onChanged du champ textform et les mettre ensemble? j'ai déjà essayé cette importation 'package: flutter / material.dart';
void main() { runApp(MyApp()); } class MyValueChanger extends StatelessWidget { @override Widget build(BuildContext context) { return RaisedButton( child: Text('Press me'), onPressed: () => ); } } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Center( child: MyValueChanger()), ), ), ); } }
4 Réponses :
Si vous souhaitez recevoir un rappel d'une fonction. Vous devrez créer une fonction comme celle-ci
final Function(String) onChange;
caller: catTree = CatTree(onChangeCat: _onChangeCat); ''' _onChangeCat(int catId) { // debugPrint('_onChangeCat callback!'); } UI: class CatTree extends StatefulWidget { final Function(int catId) onChangeCat; CatTree({this.onChangeCat}); } STATE: class _CatTreeState extends State<CatTree> { ..... >>>this.widget.onChangeCat(e.id); }
Cela devrait en fait fonctionner de manière simple. Mettez simplement la fonction passée dans le constructeur comme paramètre de votre fonction TextFormFields onSave.
class Test extends StatelessWidget { @override Widget build(BuildContext context) { return CustomTextFormField(onSaved: (text)=> doWhatever(text),); } } class CustomTextFormField extends StatelessWidget { Function(String) onSaved; CustomTextFormField({@required this.onSaved}); @override Widget build(BuildContext context) { return TextFormField(onSaved: onSaved,); } }
Si les fonctions que vous souhaitez passer deviennent plus compliquées, vous pouvez utiliser les typedefs Dart. ( https://dart.dev/guides/language/language-tour#typedefs )
Comme appuyer sur quelque chose ou changer de valeur est une occurrence très courante, vous pouvez utiliser les classes et les types prédéfinis, dans ce cas: ValueChanged<>
et pour votre cas: ValueChanged<String>
:
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyValueChanger extends StatelessWidget { final ValueChanged<String> onValueChanged; const MyValueChanger({this.onValueChanged}); @override Widget build(BuildContext context) { return RaisedButton( child: Text('Press me'), onPressed: () => this.onValueChanged('NEW VALUE')); } } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Center( child: MyValueChanger( onValueChanged: (value) => print('Value changed to: $value')), ), ), ); } }