Problème de sauvegarde image après modification

Bonjour,

Actuellement j’ai un onglet qui permet de générer l’image avec de l’ajout de texte et un onglet où on voit l’affichage de l’image modifier. J’aimerais bien sauvegardé cette image modifié dans ma galerie sauf que des règles de Dart m’en empêche, auriez-vous une idée de comment résoudre ceci ou trouver une autre méthode sauvegardé des images modifié?

J’utilise Image Provider avec la variable target qui va être mon image modifié et Image Painter State pour exporté l’image vers ma galerie
Voici la fonction en question:

class _CEEState extends State<CEE> {

  ImageProvider? target;

 String Certificat = 'assets/cee.png';

  GlobalKey globalKey = GlobalKey();

  @override

  Widget build(BuildContext context) {

    final _imageKey = GlobalKey<ImagePainterState>();

    final _key = GlobalKey<ScaffoldState>();

void saveImage() async {

      final target = await _imageKey.currentState?.exportImage();

      final directory = (await getApplicationDocumentsDirectory()).path;

      await Directory('$directory/sample').create(recursive: true);

      final fullPath =

          '$directory/sample/${DateTime.now().millisecondsSinceEpoch}.png';

      final imgFile = File.fromRawPath(target!);

      imgFile.writeAsBytesSync(target);

      ScaffoldMessenger.of(context).showSnackBar(

        SnackBar(

          backgroundColor: Colors.orangeAccent[700],

          padding: const EdgeInsets.only(left: 10),

          content: Row(

            mainAxisAlignment: MainAxisAlignment.spaceBetween,

            children: [

              TextButton(

                onPressed: () => OpenFile.open("$fullPath"),

                child: const Text(

                  "Le document modifié a bien été téléchargé",

                  style: TextStyle(

                    color: Colors.white,

                  ),

                ),

              )

            ],

          ),

        ),

Voici le header et le body de l’onglet :

return Scaffold(

        appBar: AppBar(

          title: const Text(''),

          titleTextStyle:

              const TextStyle(fontSize: 17.5, fontWeight: FontWeight.bold),

          centerTitle: true,

          actions: [

            IconButton(

                icon: Icon(Icons.save_alt),

                color: Colors.white,

                onPressed: saveImage)

          ],

        ),

  `      body: Container(`

            alignment: Alignment.center,

            width: double.infinity,

            height: double.infinity,

            child: SingleChildScrollView(

                child: InteractiveViewer(

                    child: Column(children: <Widget>[

              AspectRatio(

                aspectRatio: 0.7 / 1,

                child: Row(

                  crossAxisAlignment: CrossAxisAlignment.center,

                  mainAxisAlignment: MainAxisAlignment.center,

                  children: <Widget>[

                    AspectRatio(

                        aspectRatio: 0.7,

                        child: Image(image: target!, fit: BoxFit.fitHeight)),

                  ],

                ),

              ),

            ])))));

  }

}

Bien évidemment, il ne veut pas prendre en compte car la valeur peut être null mais en elevant ceci, cela m’affiche cette erreur.
The argument type ‹ ImageProvider? › can’t be assigned to the parameter type 'ImageProvider

Bonjour,

Il doit manquer un cast implicite « ! » quelque part où est utilisé l’objet target.

1 J'aime

Bonjour,

J’ai rajouté un « ! » a imgFile.writeAsBytesSync(target);

et ça m’affiche ceci _CastError (Null check operator used on a null value)

Il n’accepte pas que valeur puisse être null, sinon je n’ai pas vu d’autre endroit manquant.

J’ai trouvé une solution alternative,
la voici:

Future saveImage(Uint8List bytes) async {
  final directory = await getApplicationDocumentsDirectory();
  final image = File('${directory.path}/contratenergie.png');
  image.writeAsBytesSync(bytes);

  await await ImageGallerySaver.saveImage(
    bytes,
  );
  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(
      backgroundColor: Colors.orangeAccent[700],
      padding: const EdgeInsets.only(left: 10),
      content: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [
          TextButton(
            onPressed: () =>
                OpenFile.open("${directory.path}/contratenergie.png"),
            child: const Text(
              "Le contrat énergie a bien été téléchargé",
              style: TextStyle(
                color: Colors.white,
              ),
            ),
          )
        ],
      ),
    ),
  );
}
1 J'aime