我对Flutter相当陌生,我发现自己陷入了一个坑。
我要完成的工作非常简单。我有一个全局变量。假设var PlayerPointsToAdd
。然后,我有了这个有状态的小部件,该小部件应在每次全局变量不为零时更新自身。我希望能够从另一个小部件调用addPointsToPlayer()
。
到目前为止,我对有状态小部件的理解以setState((){})
结尾,我只能在有状态小部件本身内部调用它。
下面的代码在Stateful小部件内的容器内。每当按下此按钮时,它将根据PlayerScoreBoard.add()
返回的新列表调用setState。
...
child: RaisedButton(
onPressed: () {
setState(() {
if (PointsToAddPlayer != 0) {
for (int i = 0; i < PointsToAddPlayer; i++) {
PlayerScoreBoard.add(new Icon(
Icons.check_circle_outline,
size: 11));
}
PointsToAddPlayer = 0;
}
我一直在阅读文档并在YouTube上观看Flutter视频,所以请不要忽略这个问题。我真的很难理解这一点。
我认为我必须使用Streams来做到这一点。它们似乎有点复杂,但是如果那是我使用它们的唯一方法。这是否意味着我应该创建一个全局变量,最好是一个包含变量的类,并使其在所有变量更新时将其流式传输到其他所有需要更新的小部件。因此,此ScoreBoard小部件必须侦听来自全局类的Stream并进行自我更新。这会允许我更改全局类中的变量并自动将各个小部件更新为它们的新状态吗?这是否意味着每个依赖于自身外部变量的小部件都必须监听流?我非常感谢有状态小部件与流之间的关系采用ELI5。
而且由于此全局数据将被反复更新多次,因此无法使用Future。
非常感谢你。
我错误地说了一个全局类变量。我的意思是说类似 map 的内容,在这里我可以说类似
gameData.PlayerPoints
或gameData.turn
。
最佳答案
您可以尝试ValueListenableBuilder。
import 'package:flutter/material.dart';
final playerPointsToAdd =
ValueNotifier<int>(0); //TODO 1st: ValueNotifier declaration
void main() => runApp(TestApp());
class TestApp extends StatelessWidget {
@override
Widget build(BuildContext context) => MaterialApp(
routes: {
'/': (context) => HomePage(),
},
);
}
//TODO you can use StatelessWidget either
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) => Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
RaisedButton(
// TODO 3rd: change the value
onPressed: () => playerPointsToAdd.value++,
child: Text('Increase'),
),
ValueListenableBuilder(
//TODO 2nd: listen playerPointsToAdd
valueListenable: playerPointsToAdd,
builder: (context, value, widget) {
//TODO here you can setState or whatever you need
return Text(
//TODO e.g.: create condition with playerPointsToAdd's value
value == 0
? 'playerPointsToAdd equals 0 right now'
: value.toString());
},
),
RaisedButton(
onPressed: () => playerPointsToAdd.value--,
child: Text('Decrease'),
),
],
),
),
);
}
关于flutter - 当Flutter中的全局变量更改(异步)时更新小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62007967/