server_settings_dialog.dart 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import 'package:asr_client/common/constants.dart';
  4. import 'package:asr_client/providers/settings_providers.dart';
  5. import 'package:asr_client/theme/app_colors.dart';
  6. class ServerSettingsDialog extends ConsumerStatefulWidget {
  7. const ServerSettingsDialog({super.key});
  8. @override
  9. ConsumerState<ServerSettingsDialog> createState() =>
  10. _ServerSettingsDialogState();
  11. }
  12. class _ServerSettingsDialogState extends ConsumerState<ServerSettingsDialog> {
  13. late final TextEditingController _hostController;
  14. late final TextEditingController _portController;
  15. @override
  16. void initState() {
  17. super.initState();
  18. final host =
  19. ref.read(serverHostProvider).valueOrNull ?? AppConstants.defaultHost;
  20. final port =
  21. ref.read(serverPortProvider).valueOrNull ?? AppConstants.defaultPort;
  22. _hostController = TextEditingController(text: host);
  23. _portController = TextEditingController(text: port.toString());
  24. }
  25. @override
  26. void dispose() {
  27. _hostController.dispose();
  28. _portController.dispose();
  29. super.dispose();
  30. }
  31. @override
  32. Widget build(BuildContext context) {
  33. return AlertDialog(
  34. backgroundColor: AppColors.card,
  35. shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
  36. title: const Text('服务器设置'),
  37. content: Column(
  38. mainAxisSize: MainAxisSize.min,
  39. children: [
  40. TextField(
  41. controller: _hostController,
  42. decoration: const InputDecoration(
  43. labelText: '主机地址',
  44. hintText: '例如 localhost',
  45. border: OutlineInputBorder(),
  46. ),
  47. ),
  48. const SizedBox(height: 12),
  49. TextField(
  50. controller: _portController,
  51. keyboardType: TextInputType.number,
  52. decoration: const InputDecoration(
  53. labelText: '端口',
  54. hintText: '例如 8765',
  55. border: OutlineInputBorder(),
  56. ),
  57. ),
  58. ],
  59. ),
  60. actions: [
  61. TextButton(
  62. onPressed: () => Navigator.of(context).pop(),
  63. child: const Text('取消'),
  64. ),
  65. ElevatedButton(onPressed: _save, child: const Text('保存')),
  66. ],
  67. );
  68. }
  69. Future<void> _save() async {
  70. final host = _hostController.text.trim();
  71. final port =
  72. int.tryParse(_portController.text.trim()) ?? AppConstants.defaultPort;
  73. if (host.isEmpty) return;
  74. final service = ref.read(settingsServiceProvider);
  75. await service.setHost(host);
  76. await service.setPort(port);
  77. if (mounted) Navigator.of(context).pop();
  78. }
  79. }