Files
asset_assistant/frontend/asset_assistant/lib/pages/country_add_page.dart
2025-11-19 17:18:59 +08:00

239 lines
7.5 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'package:asset_assistant/utils/host_utils.dart';
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'package:shared_preferences/shared_preferences.dart';
class AddCountryPage extends StatefulWidget {
const AddCountryPage({super.key});
@override
State<AddCountryPage> createState() => _AddCountryPageState();
}
class _AddCountryPageState extends State<AddCountryPage> {
// 输入控制器 - 新增国旗控制器
final TextEditingController _nameController = TextEditingController();
final TextEditingController _codeController = TextEditingController();
final TextEditingController _flagController = TextEditingController();
// 加载状态
bool _isLoading = false;
// 表单验证键
final _formKey = GlobalKey<FormState>();
// 创建国家 - 调整请求数据
Future<void> _createCountry() async {
if (!_formKey.currentState!.validate()) {
return;
}
setState(() {
_isLoading = true;
});
try {
// 获取用户ID保持不变
final prefs = await SharedPreferences.getInstance();
final userId = prefs.getString('user_id');
if (userId == null) {
if (mounted) {
_showDialog('错误', '请先登录');
Navigator.pushReplacementNamed(context, '/login');
}
return;
}
// 准备请求数据 - 新增flag字段
final baseUrl = HostUtils().currentHost;
const path = '/country/create';
final url = '$baseUrl$path';
final requestData = {
'name': _nameController.text.trim(),
'code': _codeController.text.trim(),
'flag': _flagController.text.trim(), // 新增国旗参数
};
// 发送请求(保持不变)
final dio = Dio();
final response = await dio.post(
url,
data: requestData,
options: Options(headers: {'Content-Type': 'application/json'}),
);
// 处理响应(保持不变)
if (response.statusCode == 200) {
final result = response.data;
if (result['success'] == true) {
if (mounted) {
_showDialog('成功', '国家创建成功', () {
Navigator.pop(context, true); // 返回并通知上一页刷新
});
}
} else {
if (mounted) {
_showDialog('失败', result['message'] ?? '创建失败,请重试');
}
}
} else {
if (mounted) {
// 处理400错误时获取服务器返回的具体消息
String errorMessage = '服务器响应异常: ${response.statusCode}';
if (response.statusCode == 400 && response.data != null) {
errorMessage = response.data['message'] ?? errorMessage;
}
_showDialog('错误', errorMessage);
}
}
} on DioException catch (e) {
// 异常处理(优化错误信息提取)
String errorMessage = '网络请求失败';
if (e.response != null) {
// 从响应数据中提取错误信息
if (e.response?.data != null && e.response?.data['message'] != null) {
errorMessage = e.response?.data['message'];
} else {
errorMessage = '请求失败: ${e.response?.statusCode}';
}
} else if (e.type == DioExceptionType.connectionTimeout) {
errorMessage = '连接超时,请检查网络';
} else if (e.type == DioExceptionType.connectionError) {
errorMessage = '网络连接错误';
}
if (mounted) {
_showDialog('错误', errorMessage);
}
} catch (e) {
if (mounted) {
_showDialog('错误', '发生未知错误: $e');
}
} finally {
if (mounted) {
setState(() {
_isLoading = false;
});
}
}
}
// 显示对话框(保持不变)
void _showDialog(String title, String content, [VoidCallback? onConfirm]) {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text(title),
content: Text(content),
actions: [
TextButton(
onPressed: () {
Navigator.pop(context);
onConfirm?.call();
},
child: const Text('确定'),
),
],
),
);
}
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return Scaffold(
appBar: AppBar(
title: const Text('新增国家'),
centerTitle: true,
elevation: 4,
shadowColor: Colors.black12,
backgroundColor: theme.colorScheme.surfaceContainerHighest,
leading: IconButton(
icon: const Icon(Icons.arrow_back),
onPressed: () {
Navigator.of(context).pop();
},
),
actions: [
IconButton(
icon: const Icon(Icons.save),
onPressed: _isLoading ? null : _createCountry,
),
],
),
body: SafeArea(
child: Container(
color: theme.colorScheme.surface,
width: double.infinity,
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
child: Form(
key: _formKey,
child: Column(
children: [
// 国家名称输入框(保持不变)
TextFormField(
controller: _nameController,
style: TextStyle(color: theme.colorScheme.onSurface),
decoration: InputDecoration(
labelText: '国家名称',
hintText: '请输入国家名称',
prefixIcon: Icon(
Icons.account_balance,
color: theme.colorScheme.secondary,
),
),
validator: (value) {
if (value == null || value.trim().isEmpty) {
return '请输入国家名称';
}
return null;
},
),
const SizedBox(height: 24),
// 国家代码输入框(保持不变)
TextFormField(
controller: _codeController,
style: TextStyle(color: theme.colorScheme.onSurface),
decoration: InputDecoration(
labelText: '国家代码',
hintText: '请输入国家代码',
prefixIcon: Icon(
Icons.code,
color: theme.colorScheme.secondary,
),
),
validator: (value) {
if (value == null || value.trim().isEmpty) {
return '请输入国家代码';
}
return null;
},
),
const SizedBox(height: 24),
// 新增国旗输入框
TextFormField(
controller: _flagController,
style: TextStyle(color: theme.colorScheme.onSurface),
decoration: InputDecoration(
labelText: '国旗emoji',
hintText: '请输入国旗图片emoji',
prefixIcon: Icon(
Icons.flag,
color: theme.colorScheme.secondary,
),
),
// 国旗为可选字段,不添加验证器
),
],
),
),
),
),
);
}
}