断言失败:布尔表达式不能为空异常
Failed assertion: boolean expression must not be null exception
我正在制作一个 CheckUpdate 部分,它检查网络上的最新版本 (json) 并尝试进行比较。
它解析 JSON 并转换为字符串。
然后它尝试与 appBuildNumber 进行比较。
但它给我错误 Failed Assertion: Boolean expression must not be null
。
关于这个问题的任何想法?
P.S。版本检查服务器是 https://raw.githubusercontent.com/TanzenT/LiteCalculator/master/version.json
代码
class CalculatorPageHolder extends StatefulWidget {
CalculatorPageHolder({Key key, this.title}) : super(key: key);
final String title;
@override
_CalculatorPageHolderState createState() => _CalculatorPageHolderState();
}
class _CalculatorPageHolderState extends State<CalculatorPageHolder> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
drawer: Drawer(child: mainDrawer()),
body: Center(
child: FutureBuilder<List<Version>>(
future: fetchVersion(),
builder: (context, snapshot) {
if (snapshot.hasError) print(snapshot.error);
return snapshot.hasData
? CalculatorHolder(version: snapshot.data)
: Center(child: CircularProgressIndicator());
},
)),
);
}
}
class CalculatorHolder extends StatelessWidget {
final List<Version> version;
CalculatorHolder({Key key, this.version}) : super(key: key);
Widget checkIsLatest() {
print(version[0].version);
if (getPackageInfo(version[0].version)) {
return Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[Text('latest')],
);
} else {
return Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[Text('not latest')],
);
}
}
@override
Widget build(BuildContext context) {
return Container(child: checkIsLatest());
}
}
getPackageInfo(String _currnetVersion) {
PackageInfo.fromPlatform().then((PackageInfo packageInfo) {
String _buildNumber = packageInfo.buildNumber;
print('Client Version : $_buildNumber');
print('Server Version : $_currnetVersion');
if (_buildNumber == _currnetVersion)
return true;
else
return false;
});
}
getPackageInfo
实际上并没有返回任何东西,所以默认返回 null
这不是一个有效的布尔值。
您需要执行以下操作:
Future<bool> getPackageInfo(String _currentVersion) async {
final packageInfo = await PackageInfo.fromPlatform();
String _buildNumber = packageInfo.buildNumber;
print('Client Version : $_buildNumber');
print('Server Version : $_currentVersion');
return _buildNumber == _currentVersion;
}
请注意,此方法 returns 现在 Future
需要等待,然后才能使用生成的布尔值。您可能希望将它从小部件中取出并执行一次,因为它可能不应该在运行时更改,因为它正在获取包信息。
您实际上并不是 return 从 getPackageInfo
获取值。 (return 语句在您传递给 then
的函数中。)因此 getPackageInfo
returns null
和您测试它的 if 语句失败。
制作 getPackageInfo
async
,删除 then
并使用 await PackageInfo.fromPlatform()
- 它现在可以 return 和 Future<bool>
。当然,现在你必须等待结果,这在 build
.
中是做不到的。
考虑移动代码以将当前包上移到有状态小部件中(从 initState
调用它)并简单地传递一个布尔值,具体取决于是否是当前包下移到 CalculatorHolder
而不是版本字符串。
我正在制作一个 CheckUpdate 部分,它检查网络上的最新版本 (json) 并尝试进行比较。
它解析 JSON 并转换为字符串。
然后它尝试与 appBuildNumber 进行比较。
但它给我错误 Failed Assertion: Boolean expression must not be null
。
关于这个问题的任何想法?
P.S。版本检查服务器是 https://raw.githubusercontent.com/TanzenT/LiteCalculator/master/version.json
代码
class CalculatorPageHolder extends StatefulWidget {
CalculatorPageHolder({Key key, this.title}) : super(key: key);
final String title;
@override
_CalculatorPageHolderState createState() => _CalculatorPageHolderState();
}
class _CalculatorPageHolderState extends State<CalculatorPageHolder> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
drawer: Drawer(child: mainDrawer()),
body: Center(
child: FutureBuilder<List<Version>>(
future: fetchVersion(),
builder: (context, snapshot) {
if (snapshot.hasError) print(snapshot.error);
return snapshot.hasData
? CalculatorHolder(version: snapshot.data)
: Center(child: CircularProgressIndicator());
},
)),
);
}
}
class CalculatorHolder extends StatelessWidget {
final List<Version> version;
CalculatorHolder({Key key, this.version}) : super(key: key);
Widget checkIsLatest() {
print(version[0].version);
if (getPackageInfo(version[0].version)) {
return Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[Text('latest')],
);
} else {
return Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[Text('not latest')],
);
}
}
@override
Widget build(BuildContext context) {
return Container(child: checkIsLatest());
}
}
getPackageInfo(String _currnetVersion) {
PackageInfo.fromPlatform().then((PackageInfo packageInfo) {
String _buildNumber = packageInfo.buildNumber;
print('Client Version : $_buildNumber');
print('Server Version : $_currnetVersion');
if (_buildNumber == _currnetVersion)
return true;
else
return false;
});
}
getPackageInfo
实际上并没有返回任何东西,所以默认返回 null
这不是一个有效的布尔值。
您需要执行以下操作:
Future<bool> getPackageInfo(String _currentVersion) async {
final packageInfo = await PackageInfo.fromPlatform();
String _buildNumber = packageInfo.buildNumber;
print('Client Version : $_buildNumber');
print('Server Version : $_currentVersion');
return _buildNumber == _currentVersion;
}
请注意,此方法 returns 现在 Future
需要等待,然后才能使用生成的布尔值。您可能希望将它从小部件中取出并执行一次,因为它可能不应该在运行时更改,因为它正在获取包信息。
您实际上并不是 return 从 getPackageInfo
获取值。 (return 语句在您传递给 then
的函数中。)因此 getPackageInfo
returns null
和您测试它的 if 语句失败。
制作 getPackageInfo
async
,删除 then
并使用 await PackageInfo.fromPlatform()
- 它现在可以 return 和 Future<bool>
。当然,现在你必须等待结果,这在 build
.
考虑移动代码以将当前包上移到有状态小部件中(从 initState
调用它)并简单地传递一个布尔值,具体取决于是否是当前包下移到 CalculatorHolder
而不是版本字符串。