You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中私有类方法跨文件可调用的原因咨询(附代码)

为什么Dart中下划线开头的类的方法能被其他文件的组件调用?

我了解到在Dart中,以下划线开头的字段、类和方法只能在其定义的.dart文件中使用,但我的代码似乎违反了这一规则,想请教原因:

main.dart代码片段:

class _TestState extends State<Test> {
  int a = 0;
  void increase() {
    setState(() {
      a = a + 1;
    });
  }
  var b = ['hello', 'bye'];
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Column(
          children: <Widget>[Text(b[a]), MyButton(increase)],
        )),
    );
  }
}

MyButton.dart代码片段:

class MyButton extends StatelessWidget {
  final Function x;
  MyButton(this.x);
  @override
  Widget build(BuildContext context) {
    return Container(
      child: RaisedButton(onPressed: x,child:Text('press me')),
    );
  }
}

为什么MyButton能够调用位于另一个文件中的_TestState类的increase方法?


这其实并没有违反Dart的私有访问规则,核心原因在于你并没有让MyButton直接访问_TestState的私有方法,而是传递了一个函数引用,这里的逻辑可以拆解开来看:

  1. Dart的私有机制是库级别:下划线开头的标识符(比如_TestState、increase)确实只能在它们所属的库(默认单个.dart文件就是一个独立库)内部直接访问。也就是说,MyButton所在的文件里不能直接写_TestState().increase()这种代码,因为这属于跨库访问私有成员。

  2. 函数引用的传递是合法的:在_TestState的build方法里,你是在库内部访问了自己的increase方法,然后把这个方法的函数对象引用传递给了MyButton的构造函数。此时MyButton拿到的只是一个可以执行的函数对象,它并不知道这个函数原本属于哪个类,也没有直接去访问_TestState的私有成员——它只是调用了这个函数而已。

举个更简单的例子,类似下面的代码也是合法的:

// lib/a.dart
class _PrivateClass {
  void _privateMethod() {
    print("Hello");
  }

  Function getMethod() {
    // 在库内部可以访问私有方法,返回它的引用
    return _privateMethod;
  }
}

// lib/b.dart
import 'a.dart';

void main() {
  var func = _PrivateClass().getMethod();
  func(); // 可以正常执行,输出Hello
}

总结一下:跨库不能直接访问私有标识符,但如果在库内部把私有方法的引用传递出去,外部代码是可以调用这个函数引用的——因为外部代码并没有直接访问私有成员,只是操作了一个传递过来的函数对象。


内容的提问来源于stack exchange,提问作者user11717179

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 13:08:11