showUrlInputDialog static method
Future<String?>
showUrlInputDialog(
- BuildContext context, {
- String? initialValue,
- String title = 'Import Image from URL',
- String hintText = 'https://example.com/photo.jpg',
Displays a dialog prompting the user to enter a web image URL.
Implementation
static Future<String?> showUrlInputDialog(
BuildContext context, {
String? initialValue,
String title = 'Import Image from URL',
String hintText = 'https://example.com/photo.jpg',
}) async {
final controller = TextEditingController(text: initialValue);
final formKey = GlobalKey<FormState>();
return showDialog<String>(
context: context,
builder: (ctx) => AlertDialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
title: Row(
children: [
const Icon(Icons.link, size: 24),
const SizedBox(width: 8),
Text(title, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
],
),
content: Form(
key: formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const Text(
'Enter the direct URL of an image (JPEG, PNG, WebP, GIF):',
style: TextStyle(fontSize: 14, color: Colors.black87),
),
const SizedBox(height: 12),
TextFormField(
controller: controller,
autofocus: true,
keyboardType: TextInputType.url,
decoration: InputDecoration(
hintText: hintText,
border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)),
prefixIcon: const Icon(Icons.http),
suffixIcon: IconButton(
icon: const Icon(Icons.clear),
onPressed: () => controller.clear(),
),
),
validator: (val) {
if (val == null || val.trim().isEmpty) {
return 'Please enter a valid URL';
}
final uri = Uri.tryParse(val.trim());
if (uri == null || !uri.hasScheme || (!uri.isScheme('http') && !uri.isScheme('https'))) {
return 'Enter a valid http:// or https:// URL';
}
return null;
},
),
],
),
),
actions: [
TextButton(
onPressed: () => Navigator.of(ctx).pop(null),
child: const Text('Cancel'),
),
FilledButton(
onPressed: () {
if (formKey.currentState?.validate() ?? false) {
Navigator.of(ctx).pop(controller.text.trim());
}
},
child: const Text('Import'),
),
],
),
);
}