'package:flutter/src/widget/text.dart': Fasiled 断言: line 378 pos 10; 'data != null':必须向文本小部件提供非空字符串

时间:2021-05-26 10:59:27

标签: firebase flutter dart

访问record_patien时手机出现红屏。

这是代码

import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/material.dart';
import 'package:sensor_detak_jantung/models/sensor.dart';
import 'package:sensor_detak_jantung/models/user.dart';
import 'package:sensor_detak_jantung/screens/authenticate/sign_in.dart';
import 'package:firebase_auth/firebase_auth.dart' as firebase_auth;
import 'package:sensor_detak_jantung/services/db_path.dart';

class RecordPatient extends StatefulWidget {
  const RecordPatient({Key key}) : super(key: key);

  @override
  _RecordPatient createState() => _RecordPatient();
}

class _RecordPatient extends State<RecordPatient> {

  final databaseReference = FirebaseDatabase.instance.reference();
  final _auth = firebase_auth.FirebaseAuth.instance;
  final TextEditingController tokenController = TextEditingController();
  User userInfo;
  firebase_auth.User _user;
  Sensor sensorInfo;
  final _formKey = GlobalKey<FormState>();
  String bpm;
  void initState(){
    super.initState();
    this._user = _auth.currentUser;
    if(_user != null) {

  

这是我尝试获取 BPM 值的地方

      databaseReference.child('Sensor').once().then((DataSnapshot snapshot) {
        bpm = snapshot.value['BPM']['Data'];
      });

这是给用户的,这段代码在其他类上运行流畅。

      databaseReference.child(USER_KEY).child(_user.uid).once().then((snapshot) {
        userInfo = User.fromSnapshot(snapshot);
        setState(() { });
      });

    }
  }

  AppBar title(){
    return AppBar(
      backgroundColor: Colors.red[400],
      elevation: 0.0,
      title: Text('Hi ${userInfo?.userName}'),
      actions: <Widget>[
        FlatButton.icon(
          icon: Icon(Icons.person),
          label: Text('logout'),
          onPressed: () async {
            _auth.signOut().then((value) {
              Navigator.pushReplacement(context, new MaterialPageRoute(builder: (context) => SignIn()));
              setState(() {});
            });
          },
        ),
      ],
    );
  }

  @override


  Widget build(BuildContext context) {
    print (bpm);
    return Scaffold(
      body: Form(
        key: _formKey,
        child: ListView(
          padding: const EdgeInsets.fromLTRB(22.0, 0.0, 22.0, 22.0),
          children: [
            SizedBox(height: 40),
            title(),
            SizedBox(height: 40),
            Text (bpm),
          ],
        ),
      ),
    );
  }
}

当我尝试获取 Sensor 值和 users 值时会发生这种情况。

我仍在学习和试验中,如果有人能以简单的方式向我解释为什么会发生此错误,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

似乎 snapshot.value['BPM']['Data']; 返回 null,因此您的 Text() 小部件将 null 作为其值,这是不允许的。在将 bpm 的值分配给 Text 小部件之前,您应该添加一个空检查,可能是这样的:

SizedBox(height: 40),
title(),
SizedBox(height: 40),
(bpm == null)?Text ("No BPM received"):Text(bpm),

答案 1 :(得分:0)

正如错误中所写的,Text 小部件获得了一个空值,当我们将这样的内容传递给文本 Text(null) 时,这是一个错误。 在您的代码中,这只能在 bpm 可能为 null 的文本小部件中实现。

Text (bpm),

所以你可以简单地这样做,

databaseReference.child('Sensor').once().then((DataSnapshot snapshot) {
        bpm = snapshot.value['BPM']['Data']??"";
      });

修复错误。