未处理的异常:在 null 上调用了 getter 'name'

时间:2021-04-15 06:27:28

标签: flutter dart firebase-realtime-database firebase-authentication

Hooolaaa 社区,这里我有一个非常有趣的问题,我不太明白, 我定义了一个字符串变量 (String uName = "";) 并通过执行 ( uName = userCurrentInfo.name; ) 将我当前的用户名传递给它,之后我在 2 Text Widget(Text('${userCurrentInfo?. name}', style: TextStyle(fontSize: 16.0, fontFamily: "Brand Bold"),), 问题 : 它有时不显示用户名,直到我重新启动我的 android studio 并卸载我的应用程序并重新启动,然后它开始工作。而其他时候它只是有效。 我试过的: 我曾尝试直接从 firebase 中的 currentUser 名称调用,如下所示:( Text('${userCurrentInfo?.name}',) 和这项工作,但我不想每次都想使用该名称时重复此操作我当前用户的。 感谢您的时间

这是错误信息: 未处理的异常:NoSuchMethodError:在 null 上调用了 getter 'name'。 接收方:空

class MainScreen extends StatefulWidget
{
  static const String idScreen = "mainScreen";

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

class _MainScreenState extends State<MainScreen> with TickerProviderStateMixin
{
   String uName="";

     void locatePosition() async
  {
    Position position = await Geolocator.getCurrentPosition(desiredAccuracy: 
     LocationAccuracy.high);
    currentPosition = position;

    LatLng latLatPosition = LatLng(position.latitude, position.longitude);
    String address = await AssistantMethods.searchCoordinateAddress(position, context);
    print("This is your Address :: " + address);

    initGeoFireListner();

 =====>     uName =  userCurrentInfo.name; // I have user name stored in my uName String Variable.

     appFirebaseMonitoring();

    AssistantMethods.retrieveHistoryInfo(context);
  }

// I used it my Drawer in the build method 

 @override
  Widget build(BuildContext context) {
    createIconMarker();
    return Scaffold(
      key: scaffoldKey,
      drawer: Container(
        color: Colors.white,
        width: 255.0,
        child: Drawer(
          child: ListView(
            children: [
              //Drawer Header
              Container(
                height: 165.0,
                child: DrawerHeader(
                  decoration: BoxDecoration(color: Colors.white),
                  child: Row(
                    children: [
                      Image.asset("images/user_icon.png", height: 65.0, width: 65.0,),
                      SizedBox(width: 16.0,),
                      Expanded(
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: [
                            Text(uName, style: TextStyle(fontSize: 16.0, fontFamily: "Brand Bold"),),
                            SizedBox(height: 6.0,),
                            GestureDetector(
                                onTap: ()
                                {
                                  Navigator.push(context, MaterialPageRoute(builder: (context)=> ProfileTabPage()));
                                },
                                child: Text("Visit Profile")
                            ),
                          ],
                        ),
                      ),
                    ],
                  ),
                ),
              ),

1 个答案:

答案 0 :(得分:0)

在 Flutter 中,您需要手动更新小部件的状态。这意味着如果您有一个像 var name = "temp" 这样的变量并且您构建了一个像 Text(name) 这样的小部件,它将显示 temp。然后,如果您将 name 变量更改为 myName,文本仍会显示 temp,这是因为您需要重新绘制要使用新值构建的布局。

StateStatefulWidget 中,您有状态(变量),当它们发生变化时,您需要调用 setStatesetState 将使用新状态(变量)重绘您的布局:

void locatePosition() async {
    Position position = await Geolocator.getCurrentPosition(desiredAccuracy: 
     LocationAccuracy.high);
    currentPosition = position;

    LatLng latLatPosition = LatLng(position.latitude, position.longitude);
    String address = await AssistantMethods.searchCoordinateAddress(position, context);
    print("This is your Address :: " + address);

    initGeoFireListner();

    setState((){ // rebuild this widget with this changes
      uName =  userCurrentInfo.name;
    });

    appFirebaseMonitoring();

    AssistantMethods.retrieveHistoryInfo(context);
  }

我也没有看到你在哪里打电话 locatePosition

调用它的最简单方法是在 initState 内的 _MainScreenState 中:

  @override
  void initState() {
    super.initState();
    locatePosition();
  }

如果 userCurrentInfo?.name 有效,那么您可以做两件事:

  1. 使 uName 成为全局 getter:
import '...';

String get uName => userCurrentInfo?.name ?? '';

class ... {
 ...
}
  1. uName 初始化为 userCurrentInfo?.name
  String uName = "";

  @override
  void initState() {
    super.initState();
    uName =  userCurrentInfo?.name ?? '';
  }