我现在正在尝试使用 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/