【问题标题】:version name set to Text widget -> Failed assertion: pos 10: 'data != null'版本名称设置为 Text 小部件 -> 断言失败:pos 10: 'data != null'
【发布时间】:2020-07-04 00:05:53
【问题描述】:

安卓工作室 3.6

我想将版本名称设置为文本小部件。

这里是我的 sn-p:

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: ════════════════════════════════════════════════════════════════════════════════════════════════════

【问题讨论】:

    标签: android flutter


    【解决方案1】:

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

    【讨论】:

    • 你能将 textversion 初始化为空字符串吗?你还没有这样做
    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2022-01-23
    • 2023-03-24
    • 2020-12-15
    • 1970-01-01
    • 2020-11-21
    • 2019-12-09
    相关资源
    最近更新 更多