【问题标题】:Can't define the 'const' constructor because the field 'currentUser' is initialized with a non-constant value无法定义“const”构造函数,因为字段“currentUser”是用非常量值初始化的
【发布时间】:2022-02-02 13:57:27
【问题描述】:
  • 无法定义“const”构造函数,因为字段“currentUser” 用一个非常量值初始化。
  • 无法为具有非最终字段的类定义 const 构造函数。
  • 参数类型 'Stream>>' 不能 分配给参数类型'Widget Function(BuildContext, AsyncSnapshot>)'。
  • 已指定命名参数“builder”的参数。
  • 正文可能正常完成,导致返回“null”,但 返回类型可能是不可为空的类型。

如何解决这个错误。感谢您对此的帮助。

people.dart

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


class People extends StatelessWidget {
  const People({Key? key}) : super(key: key);
  var currentUser = FirebaseAuth.instance.currentUser!.uid;

  void callChatScreen(String name, String uid){

  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
        builder: FirebaseFirestore.instance
            .collection("users")
        .where('uid',isNotEqualTo: currentUser)
            .snapshots(),
              builder:(BuildContext,AsyncSnapshot<QuerySnapshot>snapshot){
          if(snapshot.hasError){
            return Center(
              child: Text("Something went wrong"),
            );
          }


          if (snapshot.connectionState == ConnectionState.waiting) {
            return Center(
              child: Text("Loading"),
            );
          }

          if (snapshot.hasData) {
            return CustomScrollView(
              slivers: [
                CupertinoSliverNavigationBar(
                  largeTitle: Text("People"),
                ),
                SliverList(
                    delegate: SliverChildListDelegate(
                        snapshot.data!.docs.map((DocumentSnapshot document) {
                          Map<String, dynamic>? data = document.data() as Map<String, dynamic>?;

                          return CupertinoListTile(
                            onTap:()=> callChatScreen(data['name'],data['uid'])
                            title: Text(data!['name']),
                            subtitle: Text(data['status']),
                          );

                        }).toList()))
              ],
            );
          }
          //return Container();
              });
      }
  }

【问题讨论】:

  • 您的People 构造函数不能是const,因为它的currentUser 成员。要么删除成员,要么简单地将构造函数设为非const

标签: flutter


【解决方案1】:

试试这个:


class People extends StatelessWidget {
   People({Key? key}) : super(key: key);
  var currentUser = FirebaseAuth.instance.currentUser!.uid;

  void callChatScreen(String name, String uid){

  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
        stream: FirebaseFirestore.instance
            .collection("users")
        .where('uid',isNotEqualTo: currentUser)
            .snapshots(),
              builder:(BuildContext,AsyncSnapshot<QuerySnapshot>snapshot){
          if(snapshot.hasError){
            return Center(
              child: Text("Something went wrong"),
            );
          }


          if (snapshot.connectionState == ConnectionState.waiting) {
            return Center(
              child: Text("Loading"),
            );
          }

          if (snapshot.hasData) {
            return CustomScrollView(
              slivers: [
                CupertinoSliverNavigationBar(
                  largeTitle: Text("People"),
                ),
                SliverList(
                    delegate: SliverChildListDelegate(
                        snapshot.data!.docs.map((DocumentSnapshot document) {
                          Map<String, dynamic>? data = document.data() as Map<String, dynamic>?;

                          return CupertinoListTile(
                            onTap:()=> callChatScreen(data['name'],data['uid'])
                            title: Text(data!['name']),
                            subtitle: Text(data['status']),
                          );

                        }).toList()))
              ],
            );
          }
          //return Container();
              });
      }
  }

【讨论】:

  • 正文可能正常完成,导致返回“null”,但返回类型可能是不可为空的类型。行后出现此错误 -----> builder:(BuildContext,AsyncSnapshotsnapshot)
  • 您有 3 个if 声明,如果这些都不是真的怎么办?你没有默认回报。取消注释“ //return Container(); ”可能会解决这个问题。
  • 现在可以使用了,非常感谢您的支持
  • 很高兴听到。快乐编码:)
猜你喜欢
  • 1970-01-01
  • 2010-11-28
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-23
相关资源
最近更新 更多