【发布时间】:2021-02-19 23:32:40
【问题描述】:
我有一个 StatefulWidget 类“FirstClass”,它扩展了一个状态“_FirstClassState”。从一个名为“_SecondClassState”的单独 State 类中,我试图访问一个变量的值(在“_FirstClassState”中称为“计数器”)。
我找到了解决方案,但我不确定这是否是解决问题的最佳方法。我试过查看其他类似的问题:
- How to access Stateful widget variable inside State class outside the build method?(在 StatefulWidget 类中声明变量并在 State 类中使用 'widget.' 不允许我从 '_SecondClassState' 中获取 'counter' 的值)
- 我还看到其他网站推荐使用 GlobalKey。然而,即使这可能是一个解决方案,我也没有进一步探索,因为我发现其他网站建议尽量减少 GlobalKeys 的使用
second_class.dart:
import 'package:brew_crew/question/first_class.dart';
import 'package:flutter/material.dart';
class SecondClass extends StatefulWidget {
@override
_SecondClassState createState() => _SecondClassState();
}
class _SecondClassState extends State<SecondClass> {
final FirstClass firstClass = FirstClass();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("MyApp"),
centerTitle: true,
),
body: Column(
children: <Widget>[
firstClass, //Displays the button to increase 'counter'
FlatButton(
child: Text("Submit"),
onPressed: () {
print(firstClass
.getCounter()); //I need to get the value of 'counter' here to use elsewhere
}),
],
),
);
}
}
first_class.dart
import 'package:flutter/material.dart';
class FirstClass extends StatefulWidget {
final _FirstClassState firstClassState = _FirstClassState();
@override
_FirstClassState createState() => firstClassState;
int getCounter() {
return firstClassState.counter;
}
}
class _FirstClassState extends State<FirstClass> {
int counter = 0;
//Increases counter by 1
void _increaseCounter() {
setState(() {
counter++;
});
}
@override
Widget build(BuildContext context) {
//A button which increases counter when clicked
return FlatButton.icon(
icon: Icon(Icons.add),
label: Text("Counter: $counter"),
onPressed: () {
_increaseCounter();
},
);
}
}
如您所见,在“FirstClass”中,我初始化了一个“_FirstClassState”的新实例。在 'getCounter()' 函数中使用它,我可以得到 'counter' 值。
有没有比这更好的方法(例如最佳实践、更少的代码行、更容易理解的方法等)来实现我想要做的事情?
【问题讨论】:
-
您的 FirstClass 和 SecondClass 的结构如何? SecondClass 在小部件树中位于 FirstClass 之下还是之上,还是它们是兄弟?
-
@AshutoshSingh 对不起,我是 Flutter 的新手,如果没有回答,我深表歉意。我首先加载“SecondClass”小部件,然后在“SecondClass”小部件中加载“FirstClass”小部件。所以我认为'SecondClass'将是'FirstClass'的父级