首页 > 解决方案 > 无法在构建之前初始化变量?

问题描述

我正在开发应用程序,该应用程序需要我从服务器获取数据(在我的情况下是一个简单的 firebase 实时数据库),并在调用 build 方法之前将获取的数据存储在 map 中,因为我需要在 build 中使用 map方法。

在这里,我尝试使用测试代码重新创建错误。

          import 'package:flutter/material.dart';
          import 'package:http/http.dart' as http;
          import 'dart:convert';

          class Test extends StatefulWidget {
            @override
            Map<String, dynamic> livefeed;

            State<StatefulWidget> createState() {
              // TODO: implement createState
              return TestState();
            }
          }

          class TestState extends State<Test> {
            @override
            void initState() {
              http
                  .get('HERE GOES THE URL FOR THE DATABASE ,CANT DISCLOSE')
                  .then((http.Response response) {
                widget.livefeed = json.decode(response.body);
                print(widget.livefeed);
                print(widget.livefeed.length);
              });

              // TODO: implement initState
              super.initState();
            }

            @override
            Widget build(BuildContext context) {
              return Container(
                child: Text(widget.livefeed.toString()),
              );
            }
          }

控制台打印:

{-Lh7FJV_7FIXgEUUS3Is: {skill: Andriod dev, target: Just Entered The Lab., 
username: test}, -Lh7RKgw3K2ZuKjrBZd2: {skill: Andriod dev, target: Just 
Entered The Lab., username: test}}
I/flutter ( 7078): 2

然而,当我尝试在构建方法内的屏幕上显示地图时,我的 UI 显示为 null。

我知道在 Build() 方法但初始化失败之前调用了 initState() 方法,调试控制台确认正在获取数据但它未能在屏幕上打印,这意味着在初始化值之前调用了构建。

标签: flutterdart

解决方案


你需要把它放在一个 setState 方法中 widget.livefeed = json.decode(response.body);

当然,您需要处理widget.livefeednull 时要显示的内容。正如您所说,即使在 Build() 方法之前调用了 initState() 方法,http.get()也是一个异步函数。您不能保证它会在调用 build 方法之前完成,因为它是一个异步函数。

你可以这样处理

Text(widget.livefeed!=null?widget.livefeed.toString():'some default text like loading...'),


推荐阅读