如何从Dart中的其他类访问公共静态变量?

时间:2020-07-17 09:21:52

标签: flutter dart

我无法从其他类访问公共静态布尔值,例如。我的isFull类中有一个布尔值StudyjiosListviewScreen,如下所示:

class StudyjiosListviewScreen extends StatefulWidget {

  @override
  _StudyjiosListviewScreenState createState() => _StudyjiosListviewScreenState();
}

class _StudyjiosListviewScreenState extends State<StudyjiosListviewScreen> {
  static bool isFull = false;
 ...

我想在另一个类isFull中使用此布尔值JoinStudyjio。 我在StudyjiosListviewScreen类中创建了JoinStudyjio类的实例,如下所示:

StudyjiosListviewScreen listviewScreen = StudyjiosListviewScreen();

但是当我尝试像这样使用布尔型isFull时:

if (listviewScreen.isFull) {

...

我得到一个错误。我已经将StudyjiosListviewScreen类的文件导入了JoinStudyjio类的文件中。

3 个答案:

答案 0 :(得分:0)

这是因为StudyjiosListviewScreen_StudyjiosListviewScreenState是2个不同的类。

您尝试访问的静态变量isFull属于后一个变量,而您试图通过创建第一个实例来访问它。如果它是类StudyjiosListviewScreen的静态变量,则可以直接访问它而无需创建该类的实例,例如StudyjiosListviewScreen.isFull

答案 1 :(得分:0)

如果我正确理解了您的问题,并按照我在评论中提出的建议,那么下面是一个代码示例,该示例共享一个变量和一种更改其值的方法,从父类降至两个类:

class VariableSharing62951032 extends StatefulWidget {
  @override
  _VariableSharing62951032State createState() => _VariableSharing62951032State();
}

class _VariableSharing62951032State extends State<VariableSharing62951032> {
  bool isFull = false;

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        ClassA62951032(isFull: isFull, swapIsFull: swapIsFull,),
        ClassB62951032(isFull: isFull, swapIsFull: swapIsFull,),
      ],
    );
  }

  void swapIsFull(){
    setState(() {
      isFull = !isFull;
    });
  }
}

class ClassA62951032 extends StatefulWidget {
  final bool isFull;
  final Function swapIsFull;

  ClassA62951032({
    this.isFull,
    this.swapIsFull
  });

  @override
  _ClassA62951032State createState() => _ClassA62951032State();
}

class _ClassA62951032State extends State<ClassA62951032> {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Text('Class A'),
        Text(widget.isFull.toString()),
        RaisedButton(
          child: Text('Swap isFull'),
          onPressed: () => widget.swapIsFull(),
        ),
      ],
    );
  }
}

class ClassB62951032 extends StatefulWidget {
  final bool isFull;
  final Function swapIsFull;

  ClassB62951032({
    this.isFull,
    this.swapIsFull
  });

  @override
  _ClassB62951032State createState() => _ClassB62951032State();
}

class _ClassB62951032State extends State<ClassB62951032> {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Text('Class B'),
        Text(widget.isFull.toString()),
        RaisedButton(
          child: Text('Swap isFull'),
          onPressed: () => widget.swapIsFull(),
        ),
      ],
    );
  }
}

答案 2 :(得分:0)

在类之间共享变量和方法在Flutter中非常重要。

首先,您以错误的方式传递了它。该变量将保存在状态小部件中,该状态定义为私有。 因此,或者您将其定义为公共,然后传递与您的州相关联的密钥,或者您强制更改方法。我不喜欢传递密钥,这对生产不利,因此我将使用提供程序为您提供一个更好的示例:

将提供程序库添加到您的pubspec.yaml:

provider: ^4.3.1 // Or latest version

创建一个可以保存该值的类:

class valuesHelper {

  //In this class we are storing global, dynamic values


  bool _isSeen;

  valuesHelper() {
    this._isSeen = false;
  }

  void setValue(bool value) {
    this._isSeen = value;
  }
  
  bool getValue(){
    return this._isSeen;
  }
}

现在将您的主体与提供者包装在一起并传递valuesHelper();

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return Provider(
      create: (_) => valuesHelper(),
      child: MaterialApp(
        home: MyHomePage(),
      ),
    );
  }
}

现在随时随地调用Provider.of(上下文)。

//Somwhere in your code when you have access to context:
ValueHelper helper = Provider.of<valueHelper>(context);

helper.setValue(true);



//Somwhereelse in your code when you have access to context:
ValueHelper helper = Provider.of<valueHelper>(context);

bool theValueIWant = helper.getValue();

如果您拥有异步内容和庞大的状态管理功能,Bloc会更好,更出色,但是对于这种情况,Providers绰绰有余。