我现在正在尝试使用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。
我的应用程序在两次操作之间没有退出或停止。在什么情况下会重新启用静态变量?
如果我必须保存应用程序的全局和常用信息,除了使用静态变量之外,最好的方法是什么?
提前谢谢。
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。)
如果导入以“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团队需要解决它。
我玩了一个小时,意识到似乎是什么原因。显然,当我这么做的时候:
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(),但是它没有工作。