/// UnionFlow Dropdown Tile - Ligne de paramètre avec dropdown /// /// Tile avec titre et dropdown pour les paramètres library uf_dropdown_tile; import 'package:flutter/material.dart'; import '../../unionflow_design_system.dart'; /// Tile de paramètre avec dropdown /// /// Usage: /// ```dart /// UFDropdownTile( /// title: 'Niveau de log', /// value: 'INFO', /// items: ['TRACE', 'DEBUG', 'INFO', 'WARN', 'ERROR'], /// onChanged: (value) => setState(() => _logLevel = value), /// ) /// ``` class UFDropdownTile extends StatelessWidget { /// Titre du paramètre final String title; /// Valeur actuelle final T value; /// Liste des options final List items; /// Callback appelé lors du changement final ValueChanged? onChanged; /// Couleur de fond (par défaut: surfaceVariant) final Color? backgroundColor; /// Fonction pour afficher le texte d'un item (par défaut: toString()) final String Function(T)? itemBuilder; const UFDropdownTile({ super.key, required this.title, required this.value, required this.items, this.onChanged, this.backgroundColor, this.itemBuilder, }); @override Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; final effectiveBgColor = backgroundColor ?? (isDark ? AppColors.surfaceDark : AppColors.surface); final effectiveItemBuilder = itemBuilder ?? (item) => item.toString(); return Container( margin: const EdgeInsets.only(bottom: SpacingTokens.lg), padding: const EdgeInsets.all(SpacingTokens.lg), decoration: BoxDecoration( color: effectiveBgColor, borderRadius: BorderRadius.circular(SpacingTokens.radiusLg), ), child: Row( children: [ Expanded( child: Text( title, style: AppTypography.bodyTextSmall.copyWith( fontWeight: FontWeight.w600, color: isDark ? AppColors.textPrimaryDark : AppColors.textPrimary, ), ), ), Container( padding: const EdgeInsets.symmetric(horizontal: SpacingTokens.lg), decoration: BoxDecoration( color: isDark ? AppColors.backgroundDark : Colors.white, borderRadius: BorderRadius.circular(SpacingTokens.radiusMd), border: Border.all(color: isDark ? AppColors.borderDark : AppColors.border), ), child: DropdownButtonHideUnderline( child: DropdownButton( value: value, onChanged: onChanged, items: items.map((item) { return DropdownMenuItem( value: item, child: Text(effectiveItemBuilder(item)), ); }).toList(), ), ), ), ], ), ); } }