首页 > 解决方案 > 版本名称设置为 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: ════════════════════════════════════════════════════════════════════════════════════════════════════

标签: androidflutter

解决方案


首先,你不应该在你的构建方法中做任何代价高昂的事情。其次,当您尝试将其初始化为 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 + ")";
      });
  }

推荐阅读