我无法从其他类访问公共静态布尔值,例如。我的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
类的文件中。
答案 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绰绰有余。