Flutter开发:如何跨同目录文件访问私有类与私有函数?
问题根因
Dart 语言中以 _ 为前缀的私有元素,可见范围绑定的是同一个库(Library),而非同一文件目录。你当前的三个文件是相互独立的三个库,哪怕处于同一个文件夹下,跨文件也无法访问彼此的私有类,这就是homepage.dart无法正常引用_Part1、_Part2的核心原因。
最优实现方案:通过 part / part of 关联为同一库
这种方案完全匹配你的需求:既可以把代码拆分到独立文件维护,又能保证所有_前缀的私有部件仅在这个库内部可见,项目其他位置、外部依赖完全无法访问这些私有部件。
按如下规则修改代码即可:
主文件 homepage/homepage.dart
作为库的入口,统一导入依赖、声明关联的子部件文件
import 'package:flutter/material.dart'; // 声明当前库包含的子文件,等价于将两个子文件的代码纳入同一库作用域 part 'part1.dart'; part 'part2.dart'; class Homepage extends StatelessWidget { @override Widget build(BuildContext context) { return Container( child: Column( children: [ _Part1(), _Part2(), // 同一库作用域下,可正常访问两个私有部件 ], ), ); } }
子部件文件 homepage/part1.dart
删除独立的依赖导入,声明当前文件归属的主库
// 移除原有的 import 'package:flutter/material.dart'; 语句 part of 'homepage.dart'; class _Part1 extends StatelessWidget { @override Widget build(BuildContext context) { return Container(); } }
子部件文件 homepage/part2.dart
和part1.dart修改规则完全一致
part of 'homepage.dart'; class _Part2 extends StatelessWidget { @override Widget build(BuildContext context) { return Container(); } }
备选方案:通过导出规则隐藏内部部件
如果不想使用part语法,也可以将子部件类去掉_前缀改为公开类,通过统一导出入口控制暴露范围:
- 将
part1.dart中的_Part1改为公开类Part1,part2.dart中的_Part2改为公开类Part2 - 以
homepage.dart作为目录的统一出口,仅对外暴露根Homepage部件,不导出内部子部件
import 'package:flutter/material.dart'; import 'part1.dart'; import 'part2.dart'; class Homepage extends StatelessWidget { @override Widget build(BuildContext context) { return Container( child: Column( children: [ Part1(), Part2(), ], ), ); } }
注意:这种方案的私有性弱于
part方案——如果其他文件直接import子部件文件,依然可以访问到这些内部类,仅适合对严格私有要求不高的场景。
常见踩坑提醒
part文件内不允许写顶层import、library声明,所有依赖必须由主库统一导入- 跨目录、同目录的独立文件之间,永远无法直接访问对方的
_前缀私有元素 - 不要为了方便跨文件访问,强行去掉私有前缀把所有部件公开,会破坏预期的访问权限控制逻辑
内容的提问来源于stack exchange,提问作者Prantik
相关产品推荐
相关产品推荐

