android - 版本名称设置为 Text 小部件 -> 断言失败:pos 10: 'data != null'
问题描述
安卓工作室 3.6
我想将版本名称设置为 Text 小部件。
这是我的片段:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:package_info/package_info.dart';
import 'constants.dart' as Constants;
class SignInForm extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new _SignInFormState();
}
}
class _SignInFormState extends State {
final _formKey = GlobalKey<FormState>();
String _textVersion;
@override
Widget build(BuildContext context) {
PackageInfo.fromPlatform().then((PackageInfo packageInfo) {
_textVersion =
"ver" + packageInfo.version + "(" + packageInfo.buildNumber + ")";
});
return Scaffold(
appBar: new AppBar(
centerTitle: true,
title: new Text('Sign in',
style: TextStyle(fontWeight: FontWeight.bold))),
body: new Container(
child: new Text(_textVersion)));
}
}
在 logcat 我得到错误:
I/flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════
I/flutter: ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter: The following assertion was thrown building SignInForm(dirty, state: _SignInFormState#61fee):
I/flutter: A non-null String must be provided to a Text widget.
I/flutter: 'package:flutter/src/widgets/text.dart':
I/flutter: Failed assertion: line 302 pos 10: 'data != null'
I/flutter: The relevant error-causing widget was:
I/flutter: SignInForm file:///home/alexei/dev/Tango-flutter/ios-flutter/lib/main.dart:19:19
I/flutter: When the exception was thrown, this was the stack:
I/flutter: #2 new Text (package:flutter/src/widgets/text.dart:302:10)
I/flutter: #3 _SignInFormState.build (package:flutter_sample/signinform.dart:33:24)
I/flutter: #4 StatefulElement.build (package:flutter/src/widgets/framework.dart:4619:28)
I/flutter: #5 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4502:15)
I/flutter: #6 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4675:11)
I/flutter: #7 Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5)
I/flutter: #8 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4481:5)
I/flutter: #9 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4666:11)
I/flutter: #10 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4476:5)
I/flutter: ... Normal element mounting (115 frames)
I/flutter: #125 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14)
I/flutter: #126 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5947:32)
I/flutter: ... Normal element mounting (238 frames)
I/flutter: #364 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14)
I/flutter: #365 Element.updateChild (package:flutter/src/widgets/framework.dart:3214:18)
I/flutter: #366 RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:1142:16)
I/flutter: #367 RenderObjectToWidgetElement.mount (package:flutter/src/widgets/binding.dart:1113:5)
I/flutter: #368 RenderObjectToWidgetAdapter.attachToRenderTree.<anonymous closure> (package:flutter/src/widgets/binding.dart:1055:17)
I/flutter: #369 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2607:19)
I/flutter: #370 RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/binding.dart:1054:13)
I/flutter: #371 WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:935:7)
I/flutter: #372 WidgetsBinding.scheduleAttachRootWidget.<anonymous closure> (package:flutter/src/widgets/binding.dart:917:7)
I/flutter: (elided 13 frames from class _AssertionError, class _RawReceivePortImpl, class _Timer, dart:async, and dart:async-patch)
I/flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════
解决方案
首先,你不应该在你的构建方法中做任何代价高昂的事情。其次,当您尝试将其初始化为 Text 时,_textVersion 一开始为空,因为下面的代码行将在构建中初始化 Text 后的某个时间运行。
_textVersion =
"ver" + packageInfo.version + "(" + packageInfo.buildNumber + ")";
将您的代码移至 initiState 方法。
class SignInForm extends StatefulWidget {
@override
_SignInFormState createState() => _SignInFormState();
}
class _SignInFormState extends State<SignInForm> {
String _textVersion = "";
@override
void initState() {
PackageInfo.fromPlatform().then((PackageInfo packageInfo) {
setState(() {
_textVersion =
"ver" + packageInfo.version + "(" + packageInfo.buildNumber + ")";
});
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: new AppBar(
centerTitle: true,
title: new Text('Sign in',
style: TextStyle(fontWeight: FontWeight.bold))),
body: new Container(child: new Text(_textVersion)));
}
}
或者您也可以从 initState 创建和调用另一个异步函数,因为 initState 不能标记为异步。
@override
void initState() {
getVersion();
super.initState();
}
void getVersion() async{
final packageInfo= await PackageInfo.fromPlatform();
setState(() {
_textVersion =
"ver" + packageInfo.version + "(" + packageInfo.buildNumber + ")";
});
}
推荐阅读
- python - 如何传递 tk.StringVar 变量并将它们插入到 sqlite 数据库表中?
- ruby-on-rails - 根据 Zeitwerk 的要求重命名工人(Rails 5.2.3 到 6 升级)
- css - svg中的css动画变量
- javascript - 使用 Squarespace 的交叉观察者导航
- gitlab - 从 Gitlab 中的数据库(SQL 和 repo 文件夹)中删除存储库?
- bash - 使用 bash 批量替换文件中的特定行
- python - 如何在 Faster RCNN 中实现 RPN 进行目标检测?
- reactjs - 需要更改时的只读状态
- next.js - .woff 和 .woff2 版本都加载到现场版本的站点上,而不是本地主机上
- c# - 消耗过滤器如何与操作选择一起使用?