flutter - 当Flutter中的全局变量更改(异步)时更新小部件

标签 flutter dart

我对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.PlayerPointsgameData.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/

相关文章:

dart - Flutter - 如何创建显示 RenderBox 组件的小部件?

dart - 是否可以通过名称获取类镜像?

string - 在字符串中查找字母 (charAt)

android - Flutter 项目和 Android X 迁移问题

dart - 你如何改变 List[index].fieldname 的值?

inheritance - 覆盖上层类(Class)的变量

flutter - 为什么在initState()之前调用有状态的小部件build()函数?

flutter - 在Dart中显示小部件的内置列表

flutter - Flutter 中的 FractionalOffset 和 Alignment 有什么不同?

ios - 无法加载目标 'arm64-apple-ios10.0' 的标准库