avatar.dart 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import 'package:get/get.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:image_picker/image_picker.dart';
  4. import 'package:vitalapp/architecture/storage/storage.dart';
  5. import 'package:vitalapp/components/button.dart';
  6. import 'package:vitalapp/pages/home/personal_center/controller.dart';
  7. import 'package:vitalapp/rpc.dart';
  8. class AvatarPage extends GetView<PersonalCenterController> {
  9. const AvatarPage({super.key});
  10. @override
  11. Widget build(BuildContext context) {
  12. return Padding(
  13. padding: const EdgeInsets.fromLTRB(0, 50, 10, 40),
  14. child: Stack(
  15. alignment: Alignment.center,
  16. children: [
  17. Column(
  18. children: [
  19. GestureDetector(
  20. child: Obx(
  21. () => _buildHeadImageToken(controller.state.headImageToken),
  22. ),
  23. ),
  24. // VButton(
  25. // onTap: () {},
  26. // child: const Text(
  27. // '保存头像',
  28. // style: TextStyle(fontSize: 18),
  29. // ),
  30. // )
  31. ],
  32. ),
  33. Positioned(
  34. bottom: 78,
  35. child: VButton(
  36. onTap: () {
  37. _openGallery();
  38. },
  39. child: const Text(
  40. '选择头像',
  41. style: TextStyle(fontSize: 18),
  42. ),
  43. ),
  44. ),
  45. ],
  46. ),
  47. );
  48. }
  49. Future<void> _openGallery() async {
  50. XFile? image = await ImagePicker().pickImage(source: ImageSource.gallery);
  51. if (image != null) {
  52. final url = await rpc.storage.upload(image);
  53. controller.state.headImageToken = url;
  54. controller.updateUserInfo();
  55. }
  56. }
  57. Widget _buildHeadImageToken(String? headImageToken) {
  58. if (headImageToken?.isNotEmpty ?? false) {
  59. return ClipRRect(
  60. borderRadius: BorderRadius.circular(200),
  61. child: Image.network(
  62. headImageToken!,
  63. width: 400,
  64. height: 400,
  65. fit: BoxFit.cover,
  66. ),
  67. );
  68. }
  69. return ClipRRect(
  70. borderRadius: BorderRadius.circular(200),
  71. child: Image.asset(
  72. 'assets/images/avatar.png',
  73. width: 400,
  74. height: 400,
  75. fit: BoxFit.cover,
  76. ),
  77. );
  78. }
  79. }