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")
),
],
),
),
],
),
),
),
答案 0 :(得分:0)
在 Flutter 中,您需要手动更新小部件的状态。这意味着如果您有一个像 var name = "temp"
这样的变量并且您构建了一个像 Text(name)
这样的小部件,它将显示 temp
。然后,如果您将 name
变量更改为 myName
,文本仍会显示 temp
,这是因为您需要重新绘制要使用新值构建的布局。
在 State
的 StatefulWidget
中,您有状态(变量),当它们发生变化时,您需要调用 setState
。 setState
将使用新状态(变量)重绘您的布局:
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
有效,那么您可以做两件事:
uName
成为全局 getter:import '...';
String get uName => userCurrentInfo?.name ?? '';
class ... {
...
}
uName
初始化为 userCurrentInfo?.name
: String uName = "";
@override
void initState() {
super.initState();
uName = userCurrentInfo?.name ?? '';
}