RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1434417
Accepted
bahmN
bahmN
Asked:2022-07-30 07:07:50 +0000 UTC2022-07-30 07:07:50 +0000 UTC 2022-07-30 07:07:50 +0000 UTC

单击按钮时文本未更新

  • 772

有 2 个小部件:MyHomePage和Buttons。列表中的MyHomePage信息应该显示在哪里,而 Buttons 只是作为一个单独的“自定义小部件”。当我单击按钮时,我必须更改 id 以确定 List 中的哪个项目应显示在MyHomePage中。

class _ButtonsState extends State<Buttons> {
  var s = Logic();
  void _func(int id) {
    setState(() {
      s.id = id;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        MaterialButton(
          onPressed: () => _func(1),
          child: Text('Text 1'),
        ),
        MaterialButton(
          onPressed: () => _func(2),
          child: Text('Text 2'),
        ),
      ],
    );
  }
}

但是当你点击按钮时,信息并没有更新,虽然MyHomePage有StreamBuilder

class _MyHomePageState extends State<MyHomePage> {
  var s = Logic();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            StreamBuilder<String>(
              stream: s.stream(),
              builder: (context, snapshot) {
                if (snapshot.data != null && snapshot.hasData) {
                  return Text(
                    '${snapshot.data}',
                    style: Theme.of(context).textTheme.headline4,
                  );
                } else {
                  return Container(
                    width: 100,
                    height: 100,
                    color: Colors.red,
                  );
                }
              },
            ),
            Buttons(),
          ],
        ),
      ),
    );
  }
}

这是Stream我订阅的代码StreamBuilder

class Logic {
  int? id;
  var text = ListStrings();
  Stream<String>? stream() {
    if (id == 1) {
      return Stream.value(text.text[0]);
    } else if (id == 2) {
      return Stream.value(text.text[1]);
    } else {
      return null;
    }
  }
}

单击按钮时id,类中的自身会更新。Logic错误是什么?

flutter dart
  • 1 1 个回答
  • 14 Views

1 个回答

  • Voted
  1. Best Answer
    ddo5
    2022-07-30T10:36:07Z2022-07-30T10:36:07Z
    1. 在您的示例中,Logic.stream它返回一个具有单个值的流,该值不能以任何方式更新。也就是说,它等价于以下内容:
    class Logic {
      int? id;
      var text = ListStrings();
      String? getText() {
        if (id == 1) {
          return text.text[0];
        } else if (id == 2) {
          return text.text[1];
        } else {
          return null;
        }
      }
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      var s = Logic();
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  ${s.getText()}',
                  style: Theme.of(context).textTheme.headline4,
                ),
                Buttons(),
              ],
            ),
          ),
        );
      }
    }
    
    1. var sin_ButtonsState和var sin是两个不同的对象这一事实_MyHomePageState将不再允许我们实现正确的逻辑。

    我可以建议以下方法来解决问题:

    class MyHomePage extends StatefulWidget {
      MyHomePage({required this.title});
    
      final String title;
    
      @override
      State<StatefulWidget> createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      // Объявляем s только в одном месте
      final s = Logic();
    
      @override
      void dispose() {
        // Закрываем контроллер
        s.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                StreamBuilder<String?>(
                  stream: s.textStream,
                  builder: (context, snapshot) {
                    if (snapshot.data != null && snapshot.hasData) {
                      return Text(
                        '${snapshot.data}',
                        style: Theme.of(context).textTheme.headline4,
                      );
                    } else {
                      return Container(
                        width: 100,
                        height: 100,
                        color: Colors.red,
                      );
                    }
                  },
                ),
                Buttons(s: s),
              ],
            ),
          ),
        );
      }
    }
    
    class Buttons extends StatefulWidget {
      Buttons({required this.s});
    
      final Logic s;
    
      @override
      State<StatefulWidget> createState() => _ButtonsState();
    }
    
    class _ButtonsState extends State<Buttons> {
      void _func(int id) {
        // Теперь при задании id, новое значение будет приходить в _idController
        widget.s.id = id;
      }
    
      @override
      Widget build(BuildContext context) {
        return Column(
          children: [
            MaterialButton(
              onPressed: () => _func(1),
              child: Text('Text 1'),
            ),
            MaterialButton(
              onPressed: () => _func(2),
              child: Text('Text 2'),
            ),
          ],
        );
      }
    }
    
    class Logic {
      final text = ListStrings();
    
      int? _id;
    
      int? get id => _id;
    
      set id(int? newValue) {
        _id = newValue;
        _idController.add(newValue);
      }
    
      final _idController = StreamController<int?>();
    
      Stream<String?> get textStream {
        // Трансформируем стрим для того, чтобы получать не id, а значение из списка text.text
        return _idController.stream.map<String?>(
          (id) {
            if (id == null) return null;
            final textIndex = id - 1;
            // Если индекс не входит в границы списка, возвращаем null
            if (textIndex < 0 || textIndex >= text.text.length) return null;
            return text.text[textIndex];
          },
        );
      }
    
      void dispose() {
        _idController.close();
      }
    }
    
    • 1

相关问题

  • 1 秒后打印每个列表值

  • 颤振函数调用

  • 如何将代码分配给参数

  • 如何在字符串中放置空格?

  • 更改 Firestore 中的布尔值

  • 显示数据

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5