如何访问dart中其他类的公共静态变量



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

class StudyjiosListviewScreen extends StatefulWidget {
@override
_StudyjiosListviewScreenState createState() => _StudyjiosListviewScreenState();
}
class _StudyjiosListviewScreenState extends State<StudyjiosListviewScreen> {
static bool isFull = false;
...

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

StudyjiosListviewScreen listviewScreen = StudyjiosListviewScreen();

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

if (listviewScreen.isFull) {
...

我犯了一个错误。我已经在JoinStudyjio类的文件中导入了StudyjiosListviewScreen类的文件。

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

您试图访问的静态变量isFull属于后一个变量,您试图通过创建第一个变量的实例来访问它。如果它是StudyjiosListviewScreen类的静态变量,那么您甚至可以在不创建该类的实例(如StudyjiosListviewScreen.isFull(的情况下访问它

如果我正确理解您的问题,并遵循我在评论中提出的建议,这里有一个共享变量和更改其值的方法的代码示例,从父类减少到两个类:

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(),
),
],
);
}
}

在类之间共享变量和方法在Flutter中是一件大事。

首先,你的传球方式不对。该变量保存在状态小部件中,被定义为私有。所以,或者你把它定义为公共的,然后传递一个与你的州相关的密钥,或者你改变了complextelly方法。我不喜欢传递密钥,这对生产不好,所以我会给你一个使用提供者的更好的例子:

将提供者库添加到您的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;
}
}

现在用提供者包装main并传递valuesHelp((;

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(context(。

//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会更好、更花哨,但对于这类东西,提供商绰绰有余。

最新更新