diff options
author | Iván Ávalos <avalos@disroot.org> | 2023-05-20 16:43:21 -0600 |
---|---|---|
committer | Iván Ávalos <avalos@disroot.org> | 2023-05-20 16:43:21 -0600 |
commit | cd8f22959e62c0b7b191e64f4ecfec53cba9f364 (patch) | |
tree | 9e40717d4e7b5c18694ab65558acda65875f817b /lib/widgets | |
parent | 3a3af285a7460a7e2f6850b9a8dd7465492163f6 (diff) | |
download | linkchat-cd8f22959e62c0b7b191e64f4ecfec53cba9f364.tar.gz linkchat-cd8f22959e62c0b7b191e64f4ecfec53cba9f364.tar.bz2 linkchat-cd8f22959e62c0b7b191e64f4ecfec53cba9f364.zip |
Se añade autenticación y onboarding
Diffstat (limited to 'lib/widgets')
-rw-r--r-- | lib/widgets/avatar_picker.dart | 61 | ||||
-rw-r--r-- | lib/widgets/loading_modal_widget.dart | 22 | ||||
-rw-r--r-- | lib/widgets/responsive.dart | 34 |
3 files changed, 117 insertions, 0 deletions
diff --git a/lib/widgets/avatar_picker.dart b/lib/widgets/avatar_picker.dart new file mode 100644 index 0000000..bdfec6d --- /dev/null +++ b/lib/widgets/avatar_picker.dart @@ -0,0 +1,61 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; + +class AvatarPicker extends StatelessWidget { + final ImagePicker picker = ImagePicker(); + final XFile? avatar; + final Function(XFile? avatar) onAvatarPicked; + + AvatarPicker({ + super.key, + required this.avatar, + required this.onAvatarPicked, + }); + + File? _getAvatarFile() { + return avatar == null ? null : File(avatar!.path); + } + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircleAvatar( + radius: 50.0, + backgroundImage: + _getAvatarFile() == null ? null : FileImage(_getAvatarFile()!), + child: _getAvatarFile() == null + ? const Icon(Icons.person, size: 50.0) + : null, + ), + const SizedBox(width: 18.0), + Column( + children: [ + FilledButton.icon( + icon: const Icon(Icons.camera_alt), + label: const Text('Cámara'), + onPressed: () { + picker.pickImage(source: ImageSource.camera).then((image) { + onAvatarPicked(image); + }); + }, + ), + const SizedBox(height: 16.0), + FilledButton.icon( + icon: const Icon(Icons.collections), + label: const Text('Galería'), + onPressed: () { + picker.pickImage(source: ImageSource.gallery).then((image) { + onAvatarPicked(image); + }); + }, + ) + ], + ) + ], + ); + } +} diff --git a/lib/widgets/loading_modal_widget.dart b/lib/widgets/loading_modal_widget.dart new file mode 100644 index 0000000..c19a411 --- /dev/null +++ b/lib/widgets/loading_modal_widget.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +class LoadingModal extends StatelessWidget { + const LoadingModal({super.key}); + + @override + Widget build(BuildContext context) { + return const Center( + child: Card( + shape: CircleBorder(), + child: Padding( + padding: EdgeInsets.all(20.0), + child: SizedBox( + width: 200, + height: 200, + child: CircularProgressIndicator(value: null), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/responsive.dart b/lib/widgets/responsive.dart new file mode 100644 index 0000000..f5f2739 --- /dev/null +++ b/lib/widgets/responsive.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +class Responsive extends StatelessWidget { + final Widget mobile; + final Widget? tablet; + final Widget desktop; + + const Responsive({ + super.key, + required this.mobile, + this.tablet, + required this.desktop, + }); + + static bool isMobile(BuildContext context) => + MediaQuery.of(context).size.width < 576; + + static bool isTablet(BuildContext context) => + MediaQuery.of(context).size.width >= 576 && + MediaQuery.of(context).size.width <= 992; + + static bool isDesktop(BuildContext context) => + MediaQuery.of(context).size.width > 992; + + @override + Widget build(BuildContext context) { + if (isDesktop(context)) { + return desktop; + } else if (tablet != null && isTablet(context)) { + return tablet!; + } + return mobile; + } +} |