当前位置: 首页 > 知识库问答 >
问题:

颤动/飞镖静态变量丢失/不断重新初始化

濮金鑫
2023-03-14

我现在正在尝试使用Flutter/Dart。但是当从另一个类访问时,我的静态变量不断被重新初始化。

我有一个类,在其单独的dart源文件中,保存服务器状态,声明为:

class ServerStatus{
  static int newestBinary;
  static bool serverUp;
}

我初始化了它们 @ main()

ServerStatus.newestBinary = 20;
ServerStatus.serverUp = true;

.之后,当我尝试在应用程序的另一个页面上访问它们时,变量“newestBinary”和“serverUp”都变为,就好像它们被重新初始化一样。(如果我像静态 int newestBinary = 10;一样声明它们,然后重新分配 ServerStatus.newestBinary = 20;main() 处,它仍然会在应用程序的另一个页面上显示为 10。

我的应用程序在两次操作之间没有退出或停止。在什么情况下会重新启用静态变量?

如果我必须保存应用程序的全局和常用信息,除了使用静态变量之外,最好的方法是什么?

提前谢谢。

共有3个答案

沈建柏
2023-03-14
class Glob {
  //One instance, needs factory 
  static Glob _instance;
  factory Glob() => _instance ??= new Glob._();
  Glob._();
  //

  String account ='johanacct1';

  String getServerUrl(){
    return 'http://192.168.1.60';
  }

  String getAccountUrl(){
    return getServerUrl()+'/accounts/'+account;
  }
}

在另一个文件中使用它:

`

Glob().getAccountUrl(); //http://192.168.1.60/accounts/johanacct1
Glob().account = 'philip.k.dick';
Glob().getAccountUrl(); //http://192.168.1.60/accounts/philip.k.dick

`它与<code>import‘glob一起工作。飞镖 当两个文件都在lib/目录中时。(如果在其他场景中存在问题,请使用IDK。)

杭镜
2023-03-14

如果导入以“package:your _ app _ package/file . Dart”开始,那么Flutter和Dart似乎存在为静态(全局)变量找到相同实例的问题。

假设您希望在main中有一个静态变量(myStaticVariable)。dart文件,其中有MyApp类。假设您希望在项目中的某个不同的.dart文件中获取该静态变量,方法是使用MyApp.myStaticVariable调用它。

在这种情况下,如果您使用“import package:your_app_package/main.dart”导入main.dart,则该变量将具有“null”值,即使它之前已初始化!

如果只使用“导入main.dart”(如果文件在同一个目录中)或“导入../main.dart”(如果您的文件是一个目录,那么是main.dart),您将获得MyApp.myStaticVariable的正确值。

我不知道为什么会这样,但也许就像@Kevin Moore提到的那样,有一个问题,Flutter团队需要解决它。

宇文念
2023-03-14

我玩了一个小时,意识到似乎是什么原因。显然,当我这么做的时候:

import 'package:flutter_test_app/main.dart';

它不同于

import 'main.dart';

即使两个源文件属于同一个包。

所以最后我的测试代码看起来像这样:

main .镖:

import 'package:flutter/material.dart';
import 'pageA.dart';
import 'pageB.dart';
import 'pageH.dart';

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

class MyApp extends StatelessWidget {

  static bool testFlag = false;
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {

    testFlag = true;
    ThemeData mainTheme = new ThemeData(
      primarySwatch: Colors.cyan,
    );
    print("testFlag @ MyApp: " + testFlag.toString());
    MaterialApp mainApp = new MaterialApp(
      title: 'Instabazaar',
      theme: mainTheme,
      home: new HomePage(title: 'Instabazaar'),
    );

    return mainApp;
  }
}

class HomePage extends StatefulWidget {

  final String title;
  HomePage({Key key, this.title}) : super(key: key);

  @override
  _HomePageState createState() {

    return new _HomePageState();
  }
}

class _HomePageState extends State<HomePage> {
  int _currentPageID = 0; // 0=home, 1=pageA, 2=pageB



  @override
  Widget build(BuildContext context) {

    print("testFlag @ HomePage: " + MyApp.testFlag.toString());


    AppBar appBar = new AppBar(
        title: new Text("TestApp"),
        centerTitle: true,
    );

    BottomNavigationBar bottomNavigationBar = new BottomNavigationBar(
        type: BottomNavigationBarType.shifting,
        items: <BottomNavigationBarItem>[
          new BottomNavigationBarItem(icon: new Icon(Icons.home), title: new Text('Home'), backgroundColor: Theme.of(context).accentColor),
          new BottomNavigationBarItem(icon: new Icon(Icons.explore), title: new Text('PageA'), backgroundColor: Colors.purple),
          new BottomNavigationBarItem(icon: new Icon(Icons.star), title: new Text('PageB'), backgroundColor: Colors.redAccent),
        ],
        onTap: (i) => setState( () => _currentPageID = i ),
        currentIndex: _currentPageID
    );


    Scaffold mainScaffold = new Scaffold(
      appBar: appBar,
      body: _getNewSubPage(),
      bottomNavigationBar: bottomNavigationBar,
    );
    return mainScaffold;
  }


  //MARK: navigation


  Widget _getNewSubPage(){
    switch (_currentPageID)
    {
      case 1:
        return new pageA();
      case 2:
        return new pageB();
      default:
        return new pageH();
    }
  }


}

佩吉。dart/pageB.dart:

import 'package:flutter/material.dart';
import 'package:flutter_test_app/main.dart';

class pageA extends StatefulWidget{
  pageAState createState() => new pageAState();
}


class pageAState extends State<pageA> {

  @override
  Widget build(BuildContext context) {
    print("testFlag @ pageA: " + MyApp.testFlag.toString());
    return new Container();
  }
}

飞镖:

import 'package:flutter/material.dart';
import 'main.dart';

class pageH extends StatefulWidget{
  pageHState createState() => new pageHState();
}


class pageHState extends State<pageH> {
  @override
  Widget build(BuildContext context) {
    print("testFlag @ pageH: " + MyApp.testFlag.toString());
    return new Container();
  }
}

唯一的区别是导入语句。但是,对于A页/B页,打印语句将给出“false”。至于pageH,印刷声明会给出“true”。我已经切换了导入语句,它检查出来了。我不熟悉dart实际上如何解释代码,所以我不确定它是dart的东西,设置的东西还是颤动的东西。我将继续调查,但现在我的问题已经解决。

谢谢大家的帮助。

 类似资料:
  • 问题内容: 我正在使用仅包含静态变量的类来存储所有常量和运行时属性。但是,最近我看到了引用这些变量的实例,但得到的却是null。 以下是我的课程定义: 我没有存储任何引用实例化PlayerProperties类,因为其中包含的所有变量都是静态的。 当我使用引用变量androidId时,我有时会得到null。 我已经在活动之一中初始化了变量: 我的怀疑是,垃圾收集器在两者之​​间被android踢了

  • 问题内容: 我想知道为什么默认情况下C,C ++和Java中的确切静态变量初始化为零?为什么对局部变量不是这样? 问题答案: 为什么要对静态变量进行确定性初始化而对局部变量不进行初始化? 了解如何实现静态变量。 它们的内存在链接时分配,并且它们的初始值也在链接时提供。 没有运行时开销。 另一方面,用于局部变量的内存是在运行时分配的。堆栈必须增长。你不知道以前在那里。如果需要,可以清除该内存(将其清

  • 问题内容: 如何在Java中初始化类的私有静态成员。 尝试以下操作: 但是在创建类A的第二个对象然后调用f1()时,我得到了空指针异常。 问题答案: 初始化静态成员的首选方法是(如上所述) 或者对于更复杂的初始化代码,您可以使用静态初始化程序块:

  • 问题内容: 我有以下代码: 这给了我以下错误: 解析错误:语法错误,在第19行的/home/user/Sites/site/registration/inc/registration.class.inc中出现意外的’(’,期待’)’ 所以,我想我做错了什么…但是如果不那样做怎么办?如果我用常规字符串更改mktime内容,它将起作用。所以,我知道我能做到这一点 的那种 像.. 有人有指针吗? 问题答

  • 问题内容: 我想知道静态变量何时初始化为其默认值。加载类时,先创建(分配)静态变量,然后执行静态初始化程序和声明中的初始化是否正确?在什么时候给出默认值?这导致前向参考的问题。 另外,如果你可以参考“ 为什么没有及时初始化静态字段?”这一问题进行解释,尤其是Kevin Brock在同一网站上给出的答案。我不明白第三点。 问题答案: 从请参阅Java静态变量方法: 它是一个属于类而不属于对象(实例)

  • 下面的代码片段: 我尝试使用“automatickeepaliveClientMixin和@override bool get wantKeepAlive=>true”-即保持它活动,以便下次调用它时,它不会再次调用initState(),但是它没有工作。