Déclaration de paramètre et null safety

Bonjour à tous,
j’ai un problème quand j’appelle un widget.

child: ComponentTexFormField(
  validator: (email) => EmailValidator.validate(email)
        ? 'null'
        : "Merci d'entrer une adresse email correcte.",
  hintText: "Adresse email",
  onSaved: (value) {
       _email = value;
  }),

code du widget :

import 'package:flutter/material.dart';

class ComponentTexFormField extends StatelessWidget {
  final String? hintText;
  final void Function(String?)? onSaved;
  final void Function(String)? validator;
  final TextEditingController? controller;
  final obscureText;

  ComponentTexFormField(
    {@required this.hintText,
    @required this.onSaved,
    this.validator,
    this.controller,
    this.obscureText});

  @override
  Widget build(BuildContext context) {
    return TextFormField(
    obscureText: obscureText ?? false,
    controller: controller ?? null,
    validator: validator ?? null,
    onSaved: onSaved,
    ...

message d’erreur :

The argument type ‹ void Function(String)? › can’t be assigned to the parameter type ‹ String? Function(String?)? ›.

je n’arrive pas à résoudre ce problème.
Merci d’avance pour votre aide

Le paramètre validator du TextFormField retourne une chaîne de caractères qui correspond au message d’erreur si il y en a, sinon il retourne null.

Donc dans ton ComponentTextFormField le typage de ta fonction validator doit être :
final String Function(String)? validator;

Le void indique à Dart que la fonction ne retourne rien d’où l’erreur que tu reçois.

Merci Stephan,

final String Function(String?)? validator;

J’ai rajouté le ? après le string car sinon j’ai une erreur

The argument type 'String Function(String)?' can't be assigned to the parameter type 'String? Function(String?)?'

Avec le null safety, par défaut toute variable déclarée qui n’a pas le symbole « ? » derrière son type ne peut pas être null.

Par exemple :
final int anInt = 3; // Cannot be null
final int? aNullableInt = null; // Can be null

Donc l’erreur survient car ce que je t’ai donné en déclaration manque de souplesse pour le null safety.

final String Function(String?)? validator;

Dans ce cas, le retour String ne peut pas être null, contrairement à l’argument et la fonction elle-même.
Donc oui il manque le ? derrière le retour String car il peut-être null.

Pour plus d’infos

1 J'aime