无法在构建之前初始化变量?

时间:2019-06-12 05:18:31

标签: flutter dart

我正在开发一个应用程序,该程序需要我从服务器(在我的情况下是一个简单的Firebase实时数据库)中获取数据并在调用build方法之前将获取的数据存储在map中,因为我将需要使用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却显示为空 内部的构建方法。

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

1 个答案:

答案 0 :(得分:0)

您需要将其放入setState方法中 widget.livefeed = json.decode(response.body);

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

您可以这样处理

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