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