-1
votes

comment passer une fonction à travers le constructeur en flutter

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


0 commentaires

4 Réponses :


0
votes

Si vous souhaitez recevoir un rappel d'une fonction. Vous devrez créer une fonction comme celle-ci

 final Function(String) onChange;


0 commentaires

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

0 commentaires

1
votes

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 )


0 commentaires

1
votes

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


0 commentaires