Flutter - 有状态小部件在切换选项卡时不会保存计数器状态

2023-12-19

我正在学习 flutter,正在使用 tabBars,但在保存状态时遇到问题。我在下面列出了我的问题的一个小工作示例。基本上,有一个按钮和一个状态计数器。当我单击按钮时,我看到文本字段正确更新。但是,当我切换到不同的选项卡并返回时,文本字段又回到零。

我发现如果我将以下行移到 _CounterState 之外,使其定义在文件的顶层,那么它就可以正常工作。当我切换选项卡时,计数器在我切换回来时保持正确的计数

int _counter = 0;

我认为这不是执行此操作的适当方法,并且我见过的所有示例都在类内部包含变量。谁能给我任何见解?如果它在班级内部,为什么会重置?我应该把它放在课堂之外吗?下面是简化的完整示例。

import 'package:flutter/material.dart';

void main() {
  runApp(new TabBarDemo());
}

class TabBarDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new DefaultTabController(
        length: 3,
        child: new Scaffold(
          appBar: new AppBar(
            bottom: new TabBar(
              tabs: [
                new Tab(icon: new Icon(Icons.directions_car)),
                new Tab(icon: new Icon(Icons.directions_transit)),
                new Tab(icon: new Icon(Icons.directions_bike)),
              ],
            ),
            title: new Text('Tabs Demo'),
          ),
          body: new TabBarView(
            children: [
              new Counter(),
              new Icon(Icons.directions_transit),
              new Icon(Icons.directions_bike),
            ],
          ),
        ),
      ),
    );
  }
}

class Counter extends StatefulWidget {
  @override
  _CounterState createState() => new _CounterState();
}

class _CounterState extends State<Counter> {
  int _counter = 0;

  void _increment() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Row(
      children: <Widget>[
        new RaisedButton(
          onPressed: _increment,
          child: new Text('Increment'),
        ),
        new Text('Count: $_counter'),
      ],
    );
  }
}

下面是计数器移到类之外的示例

import 'package:flutter/material.dart';

void main() {
  runApp(new TabBarDemo());
}

class TabBarDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new DefaultTabController(
        length: 3,
        child: new Scaffold(
          appBar: new AppBar(
            bottom: new TabBar(
              tabs: [
                new Tab(icon: new Icon(Icons.directions_car)),
                new Tab(icon: new Icon(Icons.directions_transit)),
                new Tab(icon: new Icon(Icons.directions_bike)),
              ],
            ),
            title: new Text('Tabs Demo'),
          ),
          body: new TabBarView(
            children: [
              new Counter(),
              new Icon(Icons.directions_transit),
              new Icon(Icons.directions_bike),
            ],
          ),
        ),
      ),
    );
  }
}

class Counter extends StatefulWidget {
  @override
  _CounterState createState() => new _CounterState();
}

int _counter = 0; //<-- MOVED OUTSIDE THE _CounterState CLASS
class _CounterState extends State<Counter> {


  void _increment() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Row(
      children: <Widget>[
        new RaisedButton(
          onPressed: _increment,
          child: new Text('Increment'),
        ),
        new Text('Count: $_counter'),
      ],
    );
  }
}

As _CounterState每次您转到需要放置的给定 TabView 时都会构建小部件_counter状态配置类中的变量(Counter).

class Counter extends StatefulWidget {
  int _counter = 0;
  @override
  _CounterState createState() => new _CounterState();
}

class _CounterState extends State<Counter> {
  void _increment() {
    setState(() {
      widget._counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Row(
      children: <Widget>[
        new RaisedButton(
          onPressed: _increment,
          child: new Text('Increment'),
        ),
        new Text('Count: ${widget._counter}'),
      ],
    );
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter - 有状态小部件在切换选项卡时不会保存计数器状态 的相关文章

随机推荐

  • 有人使用 JavaSpaces 技术吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 JavaSpaces 技术是否有真正的实际用途以及它是如何实现的 我们目前正在使用 javaspaces Sun outrigger
  • 禁止在构建时创建 *.vshost.exe 和其他文件

    我找到了有关 Microsoft Visual Studio 额外 文件的以下信息 vshost exe 文件的用途是什么 https stackoverflow com questions 774187 what is the purpo
  • C# MongoDb 序列化 Dictionary

    我的数据库中有一个记录事件的集合 每种类型的事件都有一组不同的数据 我用以下类定义了它 CollectionName LogEvent public class LogEvent public LogEvent string eventTy
  • 协议扩展初始化程序强制调用 self.init

    我刚刚阅读了有关协议初始值设定项要求的 Apple Swift 4 文档 并在协议扩展中提供了默认实现 import UIKit protocol Protocol init extension Protocol init print SD
  • JPGraph - 条形图不显示值

    我正在使用最新版本的 JPGraph 并且尝试更改 graph api 文件以在组条形图上显示值 下面是一段代码 用于显示我的更改 对于那些查看 API 的人来说 这是在 graph group 函数中 tot new BarPlot ar
  • 列出 jar 文件中的类

    如何动态加载 jar 文件并列出其中的类 以下是列出 jar 中的类的代码 import java io IOException import java util Enumeration import java util jar JarEn
  • 用于版本控制和缩小 javascript 的 Maven 插件

    单页 Javascript 应用程序 我构建了一个复杂的 ajax 驱动的单页 Web 应用程序 它使用提供 JSON 服务的 RESTful 后端 Web 服务 javascript 被分成许多不同的文件 每个文件代表某种功能或组件 虽然
  • ImportError:无法导入 DAG 气流

    我有简单的代码 我正在尝试从气流导入 DAG from airflow import DAG from airflow operators import BashOperator S3KeySensor from datetime impo
  • 为什么我可以在 GHCi 中加载模块,而 Atom 却找不到它?

    我在 Windows 10 上使用 Haskell 以及 Stack 和 Atom 有时 我喜欢编写一个独立的程序 hs文件来玩各种东西 当我这样做时 我更喜欢使用 GHCi 与其进行交互 通常 我从 Git Bash 启动它 stack
  • 一个好的单元测试应该具有什么属性?

    单元测试应该 产生确定性结果 独立 be valid 测试还应该具备哪些其他特征 啊 我最喜欢的科目 从哪里开始 根据 Gerard Meszaros 的 xUnit 测试模式 有关单元测试的书 测试应该降低风险 而不是 介绍一下 测试应该
  • Android Studio Manifest 包名合并错误

    What went wrong Execution failed for task app processDebugManifest 清单合并失败 AndroidManifest xml 3 5 40 位置处的包名称 应至少包含一个 点 字
  • 绑定到祖先的 Datacontext

    最好先向您展示我的代码 然后再提出问题
  • 将 NOT NULL 约束添加到列

    我正在使用 PHPMyAdmin 并尝试将 NOT NULL 约束添加到表的列中 PHPMyAdmin 接受我的以下查询 ALTER TABLE wall MODIFY token message varchar 40 NOT NULL 但
  • 从命令行调试 iPhone 应用程序

    我可以从 XCode 执行此操作 但我希望能够从命令行启动 iPhone 应用程序 在设备上 是否可以 为什么 因为我想捕获一些半自动测试的输出 我猜我需要使用 NSLog 输出的调试版本 但我也有兴趣了解将 NSLog stdio 数据返
  • Facebook 停止显示文章:作者

    看起来 Facebook 在过去几天改变了一些东西 我注意到文章 作者信息不再显示 文章 发布者仍然有效 https developers facebook com docs reference opengraph object type
  • 具有非可选属性的类符合具有可选属性的协议

    如果我有一个具有可选属性的协议 以及一个需要符合协议的类 该协议已经具有相同的属性 但作为非可选属性 我如何使该类符合协议 protocol MyProtocol var a String get set class MyClass var
  • 如何让 Meteor.Call 返回模板值?

    我试过了了解这篇关于这个概念的文章 https stackoverflow com questions 10379445 how to get the result of a meteor call function in a templa
  • Nifi 中并行和顺序处理的等待通知

    我有一个要求 我需要并行执行 4 个作业 并且当在所有 4 个处理器中并行完成相同的项目作业时 然后触发下一个处理器 为此我使用了等待通知 流程就像 4个并行作业 gt notify 释放信号标识符 itemid 信号计数器名称 proce
  • Haskell 程序中比其他语言更容易出现哪些错误?

    备受推崇的功能之一是 如果一个程序可以编译 那么它很可能大部分都是正确的 比用不太复杂或严格的类型系统的语言编写的程序更是如此 也就是说 Haskell 是一个将运行时错误转换为编译器错误的系统 我想知道 用 Haskell 编程是否会出现
  • Flutter - 有状态小部件在切换选项卡时不会保存计数器状态

    我正在学习 flutter 正在使用 tabBars 但在保存状态时遇到问题 我在下面列出了我的问题的一个小工作示例 基本上 有一个按钮和一个状态计数器 当我单击按钮时 我看到文本字段正确更新 但是 当我切换到不同的选项卡并返回时 文本字段