Flutter项目如何导入使用lib目录外编译的Dart Protobuf代码
解决方案
核心原因
Dart 包默认会将对外公开的代码识别为lib目录下的文件,你当前把编译生成的*.pb.dart系列文件直接放在tcb_protos包的根目录,同时存在配置拼写错误、依赖版本不兼容的问题,导致导入失败、智能提示不生效。
操作步骤
- 调整目录结构
在protos/dart_protos/路径下新建lib文件夹,把所有编译生成的cards.pb.dart、cards.pbenum.dart、cards.pbjson.dart、cards.pbserver.dart文件全部移动到该lib目录内。
同时修正配置文件名拼写:你当前dart_protos下的配置文件名为pubscpec.yaml(多了一个s),需要修改为正确的pubspec.yaml。
调整后dart_protos的结构如下:
dart_protos/ |-- .dart_tool/ |-- .packages |-- lib/ |-- cards.pb.dart |-- cards.pbenum.dart |-- cards.pbjson.dart |-- cards.pbserver.dart |-- pubspec.lock |-- pubspec.yaml
- 修正
tcb_protos的依赖配置
更新protos/dart_protos/pubspec.yaml的内容,适配新版Flutter的SDK版本要求,移除不必要的运行时依赖:
name: tcb_protos environment: # 根据你使用的Flutter对应的Dart版本调整,Flutter 3.0+可使用该范围 sdk: ">=2.17.0 <4.0.0" dependencies: # 升级protobuf版本,旧1.x版本和新版Flutter兼容性差 protobuf: ^3.1.0 dev_dependencies: # protoc_plugin是编译proto的工具,不需要作为运行时依赖,移到dev依赖下即可 protoc_plugin: ^21.1.2
- 重新安装依赖
进入client目录,依次执行以下命令清理旧缓存并拉取新依赖:
flutter clean flutter pub get
如果VSCode仍然报错,按快捷键Ctrl+Shift+P(Mac系统为Cmd+Shift+P),搜索并执行Restart Dart Analysis Server重启分析服务即可。
- 验证使用
原有导入写法无需修改,即可正常调用相关API,智能提示也会正常生效:
import 'package:tcb_protos/cards.pb.dart';
可选优化
你可以在仓库根目录编写统一的proto编译脚本,每次更新proto文件后执行脚本自动生成对应端的代码,无需手动移动文件,Dart端编译命令参考:
protoc --dart_out=grpc:protos/dart_protos/lib -I protos protos/cards.proto
内容的提问来源于stack exchange,提问作者Sal
相关产品推荐
相关产品推荐

