server_settings_dialog.dart 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. late final TextEditingController _liveKitController;
  16. @override
  17. void initState() {
  18. super.initState();
  19. final host =
  20. ref.read(serverHostProvider).valueOrNull ?? AppConstants.defaultHost;
  21. final port =
  22. ref.read(serverPortProvider).valueOrNull ?? AppConstants.defaultPort;
  23. final lkUrl = ref.read(liveKitUrlProvider).valueOrNull ??
  24. AppConstants.defaultLiveKitUrl;
  25. _hostController = TextEditingController(text: host);
  26. _portController = TextEditingController(text: port.toString());
  27. _liveKitController = TextEditingController(text: lkUrl);
  28. }
  29. @override
  30. void dispose() {
  31. _hostController.dispose();
  32. _portController.dispose();
  33. _liveKitController.dispose();
  34. super.dispose();
  35. }
  36. @override
  37. Widget build(BuildContext context) {
  38. return AlertDialog(
  39. backgroundColor: AppColors.card,
  40. shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
  41. title: const Text('服务器设置'),
  42. content: SingleChildScrollView(
  43. child: Column(
  44. mainAxisSize: MainAxisSize.min,
  45. children: [
  46. TextField(
  47. controller: _liveKitController,
  48. decoration: const InputDecoration(
  49. labelText: 'LiveKit 地址',
  50. hintText: 'ws://36.152.142.37:10003',
  51. border: OutlineInputBorder(),
  52. ),
  53. ),
  54. const SizedBox(height: 12),
  55. TextField(
  56. controller: _hostController,
  57. decoration: const InputDecoration(
  58. labelText: '主机地址',
  59. hintText: '例如 localhost',
  60. border: OutlineInputBorder(),
  61. ),
  62. ),
  63. const SizedBox(height: 12),
  64. TextField(
  65. controller: _portController,
  66. keyboardType: TextInputType.number,
  67. decoration: const InputDecoration(
  68. labelText: '端口',
  69. hintText: '例如 8765',
  70. border: OutlineInputBorder(),
  71. ),
  72. ),
  73. ],
  74. ),
  75. ),
  76. actions: [
  77. TextButton(
  78. onPressed: () => Navigator.of(context).pop(),
  79. child: const Text('取消'),
  80. ),
  81. ElevatedButton(onPressed: _save, child: const Text('保存')),
  82. ],
  83. );
  84. }
  85. Future<void> _save() async {
  86. final host = _hostController.text.trim();
  87. final port =
  88. int.tryParse(_portController.text.trim()) ?? AppConstants.defaultPort;
  89. final lkUrl = _liveKitController.text.trim();
  90. final service = ref.read(settingsServiceProvider);
  91. if (host.isNotEmpty) {
  92. await service.setHost(host);
  93. await service.setPort(port);
  94. }
  95. if (lkUrl.isNotEmpty) {
  96. await service.setLiveKitUrl(lkUrl);
  97. }
  98. ref.invalidate(liveKitUrlProvider);
  99. if (mounted) Navigator.of(context).pop();
  100. }
  101. }