When i use docx_template my catch get the next error:
Unsupported operation: Cannot modify an unmodifiable list
I found something in stackoverflow but I cant make this changes in FlutterFlow:
https://stackoverflow.com/questions/78435595/docx-template-package-flutter-unsupportederror-unsupported-operation-cannot-mo
I have this custom action:
// Automatic FlutterFlow imports
import '/backend/schema/structs/index.dart';
import '/backend/supabase/supabase.dart';
import '/actions/actions.dart' as action_blocks;
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/custom_code/actions/index.dart'; // Imports other custom actions
import '/flutter_flow/custom_functions.dart'; // Imports custom functions
import 'package:flutter/material.dart';
// Begin custom action code
// DO NOT REMOVE OR MODIFY THE CODE ABOVE!
import 'dart:typed_data';
import 'package:docx_template/docx_template.dart';
import 'package:http/http.dart' as http;
import 'dart:html' as html;
import 'package:intl/intl.dart';
Future generateDocx(
String dac,
String secretario,
String puesto,
String nombrePeticionario,
String apellidoPaterno,
String apellidoMaterno,
String calle,
String coloniaPeticion,
String telefono,
String peticion,
String dependencia,
String folio,
String inicialesCap,
) async {
try {
// URL de la plantilla en Supabase o tu servidor
final url =
'mydocxtemplateurl';
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
// Convertir el contenido de la plantilla en bytes
final bytes = response.bodyBytes;
// Crear el objeto DocxTemplate
final docx = await DocxTemplate.fromBytes(bytes);
// Generar la fecha actual en el formato "20 DE NOVIEMBRE DE 2024"
final now = DateTime.now();
final formattedDate = DateFormat('d', 'es').format(now).toUpperCase() +
' DE ' +
DateFormat('MMMM', 'es').format(now).toUpperCase() +
' DE ' +
DateFormat('y').format(now);
// Concatenar el nombre completo
final nombreCompleto =
'$nombrePeticionario $apellidoPaterno $apellidoMaterno';
// Crear las filas de la tabla
final tableRows = [
RowContent()
..add(TextContent("nombre_peticionario", nombreCompleto))
..add(TextContent("calle", calle))
..add(TextContent("colonia_peticion", coloniaPeticion))
..add(TextContent("telefono", telefono))
..add(TextContent("peticion", peticion))
..add(TextContent("dependencia", dependencia))
..add(TextContent("folio", folio)),
// Agregar más filas si es necesario
];
// Crear el contenido de la tabla
final tableContent = TableContent("table", tableRows);
// Crear el objeto Content para el contenido dinámico
final content = Content()
..add(TextContent("dac", dac))
..add(TextContent("secretario", secretario))
..add(TextContent("puesto", puesto))
..add(TextContent("date", formattedDate))
..add(TextContent("iniciales_cap", inicialesCap))
..add(tableContent); // Agregar la tabla
// Generar el archivo DOCX
final docxBytes = await docx.generate(
content,
tagPolicy:
TagPolicy.saveText, // Opcional: elimina etiquetas no resueltas
// Conserva las imágenes originales si no son reemplazadas
);
// Si el documento fue generado, ofrecerlo como descarga
if (docxBytes != null) {
final blob = html.Blob([docxBytes]);
final url = html.Url.createObjectUrlFromBlob(blob);
final anchor = html.AnchorElement(href: url)
..target = '_blank'
..download = 'OFICIO_${folio}.docx' // Nombre del archivo generado
..click();
// Revocar la URL temporal
html.Url.revokeObjectUrl(url);
print('Documento generado exitosamente');
} else {
print('Error: No se pudo generar el documento.');
}
} else {
print('Error al descargar la plantilla: ${response.statusCode}');
}
} catch (e) {
print('Error al generar el documento: $e');
}
}