Flutter Retrofit报错:文件多库归属及构造函数找不到
Flutter编译报错:
A file can't be part of more than one library 解决方法 报错现象
应用编译失败,核心错误提示:
A file can't be part of more than one library- 找不到
_AppServiceClient构造函数
问题代码
app_api.dart(手写核心代码)
import 'package:dio/dio.dart'; import 'package:firstproject/app/constants.dart'; import 'package:firstproject/data/response/responses.dart'; import 'package:retrofit/http.dart'; part 'app_api.g.dart'; @RestApi(baseUrl: Constants.baseUrl) abstract class AppServiceClient { factory AppServiceClient(Dio dio, {String baseUrl}) = _AppServiceClient; // POST请求实现 @POST("customers/login") Future<AuthenticationResponse> login( @Field("email") String email, @Field("password") String password, ); }
app_api.g.dart(Retrofit自动生成代码)
// GENERATED CODE - DO NOT MODIFY BY HAND part of 'app_api.dart'; // ************************************************************************** // RetrofitGenerator // ************************************************************************** // ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers class _AppServiceClient implements AppServiceClient { _AppServiceClient( this._dio, { this.baseUrl, }) { baseUrl ??= 'http://hesham060.mocklab.io/'; } final Dio _dio; String? baseUrl; @override Future<AuthenticationResponse> login( email, password, ) async { const _extra = <String, dynamic>{}; final queryParameters = <String, dynamic>{}; final _headers = <String, dynamic>{}; final _data = { 'email': email, 'password': password, }; final _result = await _dio.fetch<Map<String, dynamic>>( _setStreamType<AuthenticationResponse>(Options( method: 'POST', headers: _headers, extra: _extra, ) .compose( _dio.options, 'customers/login', queryParameters: queryParameters, data: _data, ) .copyWith(baseUrl: baseUrl ?? _dio.options.baseUrl))); final value = AuthenticationResponse.fromJson(_result.data!); return value; } RequestOptions _setStreamType<T>(RequestOptions requestOptions) { if (T != dynamic && !(requestOptions.responseType == ResponseType.bytes || requestOptions.responseType == ResponseType.stream)) { if (T == String) { requestOptions.responseType = ResponseType.plain; } else { requestOptions.responseType = ResponseType.json; } } return requestOptions; } }
完整报错详情
lib/data/network/app_api.g.dart: Error: A file can't be part of more than one library. Try moving the shared declarations into the libraries, or into a new library. lib/data/network/app_api.dart: Context: Used as a part in this library. lib/data/network/app_Api.dart: Context: Used as a part in this library. lib/data/network/app_Api.dart:9:56: Error: Couldn't find constructor '_AppServiceClient'. factory AppServiceClient(Dio dio, {String baseUrl}) = _AppServiceClient; ^ lib/data/network/app_Api.dart:9:56: Error: Redirection constructor target not found: '_AppServiceClient' factory AppServiceClient(Dio dio, {String baseUrl}) = _AppServiceClient; ^ lib/data/network/app_api.g.dart : error : A file can't be part of more than one library. [C:\Users\hesha\OneDrive\Desktop\coding\Mena advanced Course\First Project\firstproject\build\windows\flutter\flutter_assemble.vcxproj] lib/data/network/app_Api.dart(9,56): error GF7CA4DBF: Couldn't find constructor '_AppServiceClient'. [C:\Users\hesha\OneDrive\Desktop\coding\Mena advanced Course\First Project\firstproject\build\windows\flutter\flutter_assemble.vcxproj] lib/data/network/app_Api.dart(9,56): error G22A956AA: Redirection constructor target not found: '_AppServiceClient' [C:\Users\hesha\OneDrive\Desktop\coding\Mena advanced Course\First Project\firstproject\build\windows\flutter\flutter_assemble.vcxproj] FAILURE: Build failed with an exception. * Where: Script 'C:\Users\hesha\OneDrive\Desktop\coding\flatter coding\flutter_windows_2.8.1-stable\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 1159 * What went wrong: Execution failed for task ':app:compileFlutterBuildDebug'. > Process 'command 'C:\Users\hesha\OneDrive\Desktop\coding\flatter coding\flutter_windows_2.8.1-stable\flutter\bin\flutter.bat'' finished with non-zero exit value 1 * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights.
解决步骤
- 拆分代码到独立文件:将手写的
app_api.dart和Retrofit生成的app_api.g.dart分别保存为两个独立文件,禁止合并在同一文件中。 - 修复文件名大小写问题:报错中出现
app_api.dart和app_Api.dart两种大小写命名,Dart的part语句对文件名大小写敏感,需确保:app_api.dart中的part 'app_api.g.dart';语句与实际生成文件的文件名完全一致- 所有文件引用使用统一的大小写命名
- 重新生成Retrofit代码:删除现有
app_api.g.dart,执行命令重新生成:flutter pub run build_runner build - 清理项目缓存:若问题仍存在,执行以下命令后重新编译:
flutter clean flutter pub get flutter pub run build_runner build --delete-conflicting-outputs
内容的提问来源于stack exchange,提问作者Hesham Khaled
相关产品推荐
相关产品推荐

