首页 > 解决方案 > 必须向 Text 小部件颤振提供非空字符串

问题描述

我对这段代码有这个问题。我试图解决这个问题,但我没有成功。请帮忙

请看截图以很好地理解问题

必须向 Text 小部件提供非空字符串。'package:flutter/src/widgets/text.dart':断言失败:第 370 行 pos 10:'data != null'

图片描述错误

火力基地中的空

用户电子邮件地址。如果匿名登录,则为空。

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';

import 'package:flash_chat/constants.dart';

class ChatScreen extends StatefulWidget {
  static const Id = 'chat_screen';
  @override
  _ChatScreenState createState() => _ChatScreenState();
}

class _ChatScreenState extends State<ChatScreen> {
  // ignore: deprecated_member_use
  final _firestore = Firestore.instance;
  final _auth = FirebaseAuth.instance;
  // ignore: deprecated_member_use
  FirebaseUser loggedInUser;
  String messageText;
  @override
  void initState() {
    super.initState();
    getCurrentUser();
  }

  void getCurrentUser() async {
    try {
      // ignore: await_only_futures
      final user = await _auth.currentUser;

      if (user != null) {
        loggedInUser = user;
        print(loggedInUser.email);
      }
    } catch (e) {
      print(e);
    }
  }

  // void getMessages() async {
  //   // ignore: deprecated_member_use
  //   final messages = await _firestore.collection('Messages').getDocuments();
  //   // ignore: deprecated_member_use
  //   for (var message in messages.docs) {
  //     print(message.data());
  //   }
  // }
  void messagesStream() async {
    await for (var snapshot in _firestore.collection('Messages').snapshots()) {
      for (var message in snapshot.docs) {
        print(message.data());
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: null,
        actions: <Widget>[
          IconButton(
              icon: Icon(Icons.close),
              onPressed: () {
                messagesStream();
                //_auth.signOut();
                //Navigator.pop(context);
              }),
        ],
        title: Text('⚡️Chat'),
        backgroundColor: Colors.lightBlueAccent,
      ),
      body: SafeArea(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            StreamBuilder<QuerySnapshot>(
              stream: _firestore.collection('Messages').snapshots(),
              // ignore: missing_return
              builder: (context, snapshot) {
                if (!snapshot.hasData) {
                  return Center(
                      child: CircularProgressIndicator(
                    backgroundColor: Colors.lightBlueAccent,
                  ));
                }
                // ignore: deprecated_member_use
                final messages = snapshot.data.documents;
                List<Messagebubble> messagebubbles = [];
                for (var message in messages) {
                  final messageText = message.data()['text'];
                  final messagesendar = message.data()['Sender'];
                  final messagebubble = Messagebubble(
                    sendar: messagesendar,
                    text: messageText,
                  );
                  messagebubbles.add(messagebubble);
                }
                return Expanded(
                  child: ListView(
                    padding: EdgeInsets.symmetric(
                      horizontal: 10.0,
                      vertical: 20.0,
                    ),
                    children: messagebubbles,
                  ),
                );
              },
            ),
            Container(
              decoration: kMessageContainerDecoration,
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Expanded(
                    child: TextField(
                      onChanged: (value) {
                        messageText = value;
                      },
                      decoration: kMessageTextFieldDecoration,
                    ),
                  ),
                  FlatButton(
                    onPressed: () {
                      _firestore.collection('Messages').add({
                        'text': messageText,
                        'Sender': loggedInUser,
                      });
                    },
                    child: Text(
                      'Send',
                      style: kSendButtonTextStyle,
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class Messagebubble extends StatelessWidget {
  Messagebubble({
    Key key,
    this.sendar,
    this.text,
  }) : super(key: key);
  final String sendar;
  final String text;

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.all(10.0),
      child: Column(
        children: [
          Text(
            sendar,
            style: TextStyle(
              fontSize: 12.0,
              color: Colors.black54,
            ),
          ),
          Material(
            borderRadius: BorderRadius.circular(30.0),
            elevation: 5.0,
            color: Colors.lightBlueAccent,
            child: Padding(
              padding: EdgeInsets.symmetric(
                vertical: 10.0,
                horizontal: 20.0,
              ),
              child: Text(
                text,
                style: TextStyle(
                  color: Colors.white,
                  fontSize: 15.0,
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

标签: firebaseflutterdart

解决方案


您只需要检查您传递的文本是否是null。如果是null,则可以显示该用户是Anonymous

final messageText = message.data()['text'];
final messagesendar = message.data()['Sender'] ?? 'Anonymous'; // If null then use 'Anonymous'

final messagebubble = Messagebubble(
  sendar: messagesendar,
  text: messageText,
);

Flutter 不允许您传递nullText小部件。


推荐阅读