Flutter 仅在从API热重新加载颤振后检索该值

Flutter 仅在从API热重新加载颤振后检索该值,flutter,Flutter,我对Flatter有点陌生,我一直在使用rest API作为后端构建应用程序,每当我尝试从GET API加载数据以显示在主页屏幕上时,我都无法获取值,直到在从登录屏幕推送和替换后重新加载或刷新应用程序上的小部件。请帮帮我!!!已经一个星期了,我仍然坚持着 我的代码: class HomePage extends StatefulWidget{ final String name; HomePage(this.name); @override _HomePageState cr

我对Flatter有点陌生,我一直在使用rest API作为后端构建应用程序,每当我尝试从GET API加载数据以显示在主页屏幕上时,我都无法获取值,直到在从登录屏幕推送和替换后重新加载或刷新应用程序上的小部件。请帮帮我!!!已经一个星期了,我仍然坚持着

我的代码:

class HomePage extends StatefulWidget{

  final String name;
  HomePage(this.name);

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

class _HomePageState extends State<HomePage>{

  String token;

  void iniState() {
    super.initState();
    GetRequest().getUserName(token);
  }
  
  Widget build(BuildContext context){
    return Scaffold(
      body: Container(
        alignment: Alignment.topCenter,
        child: SafeArea(
          child: bodyPage(context),
        ),
      ),  
    );   
  }
}

Widget bodyPage(BuildContext context) {
  
  return Scaffold(
    body: SafeArea(
      child: SingleChildScrollView(
        child: Container(
          padding: EdgeInsets.symmetric(horizontal: 20.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              SizedBox(height: 15),
              _appBar(context),
            ],
          ),
        ),
      ),
    ),
  );
}

  _appBar(context) {

    String myName = mData.fullname;

    return Row(
      children: <Widget>[
        CircleAvatar(
          backgroundImage: NetworkImage(
              "https://jshopping.in/images/detailed/591/ibboll-Fashion-Mens-Optical-Glasses-Frames-Classic-Square-Wrap-Frame-Luxury-Brand-Men-Clear-Eyeglasses-Frame.jpg"),
        ),
        SizedBox(width: 15),
        Text("Hello, ", 
          style: TextStyle(
            fontWeight: FontWeight.bold,
            fontSize: 18,
          ),
        ),
        Text( 
          myName ?? 'KOOMPI',
            style: TextStyle(
              fontSize: 18,
              fontWeight: FontWeight.w600,
              color: Colors.blueAccent)),
      ],
    );
  }
类主页扩展StatefulWidget{
最后的字符串名;
主页(此名称);
@凌驾
_HomePageState createState()=>\u HomePageState();
}
类_HomePageState扩展状态{
字符串标记;
无效状态(){
super.initState();
GetRequest().getUserName(令牌);
}
小部件构建(构建上下文){
返回脚手架(
主体:容器(
对齐:alignment.topCenter,
儿童:安全区(
子项:bodyPage(上下文),
),
),  
);   
}
}
小部件bodyPage(构建上下文){
返回脚手架(
正文:安全区(
子:SingleChildScrollView(
子:容器(
填充:边缘组。对称(水平:20.0),
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
尺寸箱(高度:15),
_appBar(上下文),
],
),
),
),
),
);
}
_appBar(上下文){
字符串myName=mData.fullname;
返回行(
儿童:[
圆形(
背景图片:NetworkImage(
"https://jshopping.in/images/detailed/591/ibboll-Fashion-Mens-Optical-Glasses-Frames-Classic-Square-Wrap-Frame-Luxury-Brand-Men-Clear-Eyeglasses-Frame.jpg"),
),
尺寸箱(宽度:15),
文本(“你好,”,
样式:TextStyle(
fontWeight:fontWeight.bold,
尺码:18,
),
),
文本(
我的名字叫“KOOMPI”,
样式:TextStyle(
尺码:18,
fontWeight:fontWeight.w600,
颜色:颜色。蓝色调),
],
);
}
编辑

获取用户名代码:

class GetRequest{

  String messageAlert;

  Future<void> getUserName(String _token) async {
    var response = await http.get("${ApiService.url}/dashboard", 
        headers: <String, String>{
        "accept": "application/json",
        "authorization": "Bearer " + _token,
        //"token": _token,
    });
    var responseBody = json.decode(response.body);
    mData = ModelUserData.fromJson(responseBody);
  }
  
}
class ModelUserData{

  String fullname;

  ModelUserData({
    this.fullname
  });

  ModelUserData.fromJson(Map<String,dynamic> parseJson){
    fullname = parseJson['full_name'];
  }

}
  
var mData = ModelUserData();
class-GetRequest{
字符串消息警报;
未来getUserName(字符串\u令牌)异步{
var response=wait http.get(“${ApiService.url}/dashboard”,
标题:{
“接受”:“应用程序/json”,
“授权”:“承载人”+_令牌,
//“令牌”:,
});
var responseBody=json.decode(response.body);
mData=ModelUserData.fromJson(responseBody);
}
}
这里是mData:

class GetRequest{

  String messageAlert;

  Future<void> getUserName(String _token) async {
    var response = await http.get("${ApiService.url}/dashboard", 
        headers: <String, String>{
        "accept": "application/json",
        "authorization": "Bearer " + _token,
        //"token": _token,
    });
    var responseBody = json.decode(response.body);
    mData = ModelUserData.fromJson(responseBody);
  }
  
}
class ModelUserData{

  String fullname;

  ModelUserData({
    this.fullname
  });

  ModelUserData.fromJson(Map<String,dynamic> parseJson){
    fullname = parseJson['full_name'];
  }

}
  
var mData = ModelUserData();
类ModelUserData{
字符串全名;
ModelUserData({
这是我的全名
});
ModelUserData.fromJson(Map-parseJson){
fullname=parseJson['full_name'];
}
}
var mData=ModelUserData();

首先,您的
initState
有一个输入错误,并且没有
@override
标记。应该是这样的:

@override
void initState() {
    super.initState();
然后,就不会显示mData来自何处。业务逻辑代码通常是必需的。这就是
GetRequest()

无论如何,最简单的方法是使getUserName如下:

Future<String> getUserName(String token) async {
     // do your thing
     return userName;
}
现在,当请求解析时,小部件将重建,您可以直接在UI代码中使用userName变量


然而,随着应用程序的增长,这将很快变得单调乏味。要使它更干净,请学习。

我更改了您的方法
getUserName
以返回数据,而不是在其中分配
mData

class GetRequest{

    String messageAlert;

    Future<ModelUserData> getUserName(String _token) async {
        var response = await http.get("${ApiService.url}/dashboard", 
            headers: <String, String>{
            "accept": "application/json",
            "authorization": "Bearer " + _token,
            //"token": _token,
        });
        var responseBody = json.decode(response.body);
        return ModelUserData.fromJson(responseBody);
    }
}

这里最重要的是在模型到达时校准
设置状态

您丢失了很多信息。。。
getUserName
如何为小部件提供名称?我看到一个变量
mData
,但您没有显示如何填充它;