android - Flutter/Dart 静态变量丢失/不断重新初始化

标签 android ios dart flutter

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

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

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

我通过

@ main() 初始化了它们
ServerStatus.newestBinary = 20;
ServerStatus.serverUp = true;

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

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

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

提前致谢。

最佳答案

我玩了一个小时,才意识到原因。显然当我这样做时:

import 'package:flutter_test_app/main.dart';

不一样
import 'main.dart';

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

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

main.dart:

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();
    }
  }


}

pageA.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();
  }
}

pageH.dart:

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();
  }
}

唯一的区别是 import 语句。但是,对于 pageA/pageB,打印语句会给出“false”。至于 pageH,打印语句将给出“真”。我已经切换了导入语句并检查了它。我不熟悉 dart 是如何实际解释代码的,所以我不确定它是 dart 的东西,setup 的东西还是 Flutter 的东西。我会继续调查,但现在我的问题已经解决了。

感谢大家的帮助。

关于android - Flutter/Dart 静态变量丢失/不断重新初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45772318/

相关文章:

flutter - Flutter-不再显示在小部件树中的小部件,或者此错误可能表示内存泄漏警告

Dart pub 更新失败

ios - 将目录中的所有图像显示到 Flutter 中的列表

android - AltBeacon库——如何在远程服务中使用

android - 跟踪推送通知并记录它们

android - 检测从 backstack 弹出时 fragment 在 OnResume 中是否真正可见

android - android 是否支持为 VoIP 和 PTT 项目实现 RTP、RTSP 的 API?

ios - 如何在现有图像上添加水印

ios - 从先前的开发者帐户删除应用程序ID后,创建具有相同捆绑软件ID的应用程序ID

ios - NSExtension 激活规则不起作用