为啥我的数据没有在 Flutter for web 中使用 api 从实时数据库中检索

Posted

技术标签:

【中文标题】为啥我的数据没有在 Flutter for web 中使用 api 从实时数据库中检索【英文标题】:why my data is not retrieving from real-time database using api in flutter for web为什么我的数据没有在 Flutter for web 中使用 api 从实时数据库中检索 【发布时间】:2021-12-20 00:09:26 【问题描述】:

我正在尝试从 Flutter 中的实时数据库 Firebase 中获取数据以用于 Web 应用程序。所以,我尝试了几种方法,但无法使其工作。这些是我目前用于从实时数据库中检索数据的代码。

我正在尝试将数据提取到列表视图中。

import 'dart:convert';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
import 'package:nasofficialproject/Modals/PostsModals.dart';
import 'package:nasofficialproject/Provider/Upin.dart';
import 'package:provider/provider.dart';

class DashboardPage extends StatefulWidget 
  const DashboardPage(Key key) : super(key: key);
  @override
  _DashboardPageState createState() => _DashboardPageState();


class _DashboardPageState extends State<DashboardPage> 

  final fb = FirebaseDatabase.instance;
  List<PostModels> postmodal = [];
  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
  var pro;

  @override
  void initState() 
    super.initState();
    pro = Provider.of<upin>(context, listen: false);
    getPostList();
  

  Future<void> getPostList() async 
    final values = await http.get(Uri.parse(
        'https://officialnasproject-default-rtdb.firebaseio.com/Schools/$pro.upin1/School-Posts.json'));
    var val = json.decode(values.body) as Map<String, dynamic>;

    val.forEach((key, value) 
      PostModels postModels = new PostModels(
        value['PostContent'],
        value['PostUserName'],
        value['PostDate'],
        value['PostUserRole'],
        value['PostTitle'],
        value['PostUploader'],
        value['Upin'],
      );
      postmodal.add(postModels);
    );
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: Container(
        child: Flexible(
          child: postmodal.length == 0 ? Center(
            child: SelectableText("No posts yet....", style: TextStyle(fontSize: 20),),) :
          ListView.builder(
              itemCount: postmodal.length,
              itemBuilder: (_, index) 
                return CardUI(
                  postmodal[index].PostContent,
                  postmodal[index].PostUserName,
                  postmodal[index].PostDate,
                  postmodal[index].PostUserRole,
                  postmodal[index].PostTitle,
                  postmodal[index].PostUploader,
                  postmodal[index].Upin,
                );
              ),
        ),
      ),
    );
  

  Widget CardUI(String PostContent, String PostUserName, String PostDate, String PostUserRole, String PostTitle, String PostUploader, String Upin)
  
    return Card(
      child: Container(
                child: Column(
                    children: <Widget> [
                      Text(PostUserName,),
                     Text('@'+PostUserRole,),
                      Text(PostTitle,),
                      Text(PostContent),
                ],
            ),
        ),
    );
  


这些是我用于获取和显示数据的代码,但我不知道它为什么不起作用。有人可以帮助我吗,这对我来说意义重大,因为我正在尝试连续四天解决这个问题,但还没有解决。

【问题讨论】:

【参考方案1】:

第一次创建 Widget 时,它会运行 initState,但它会在您获取数据时运行 build - 并且没有任何内容可以显示。

一旦您的数据被接收 - 没有任何东西告诉 Widget 重建。

最好的方法是使用 FutureBuilder。它会做什么——它会在你等待数据时呈现你想要的东西——在我下面的示例中,它将呈现 CircularProgressIndicator。一旦未来完成,它将再次呈现 - 这次显示您的数据。

类似这样的东西(我没有尝试编译,所以可能需要一些更正):

import 'dart:convert';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
import 'package:nasofficialproject/Modals/PostsModals.dart';
import 'package:nasofficialproject/Provider/Upin.dart';
import 'package:provider/provider.dart';

class DashboardPage extends StatefulWidget 
  const DashboardPage(Key key) : super(key: key);
  @override
  _DashboardPageState createState() => _DashboardPageState();


class _DashboardPageState extends State<DashboardPage> 

  final fb = FirebaseDatabase.instance;
  List<PostModels> postmodal = [];
  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
  var pro;
  Future<void> _future;

  @override
  void initState() 
    super.initState();
    pro = Provider.of<upin>(context, listen: false);
    _future=getPostList();
  

  Future<void> getPostList() async 
    final values = await http.get(Uri.parse(
        'https://officialnasproject-default-rtdb.firebaseio.com/Schools/$pro.upin1/School-Posts.json'));
    var val = json.decode(values.body) as Map<String, dynamic>;

    val.forEach((key, value) 
      PostModels postModels = new PostModels(
        value['PostContent'],
        value['PostUserName'],
        value['PostDate'],
        value['PostUserRole'],
        value['PostTitle'],
        value['PostUploader'],
        value['Upin'],
      );
      postmodal.add(postModels);
    );
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: FutureBuilder<void>(
             future: _future,
             builder: (BuildContext context, AsyncSnapshot<void> snapshot) 
if (snapshot.connectionState==ConnectionState.waiting) return CircularProgressIndicator();

return Container(
        child: Flexible(
          child: postmodal.length == 0 ? Center(
            child: SelectableText("No posts yet....", style: TextStyle(fontSize: 20),),) :
          ListView.builder(
              itemCount: postmodal.length,
              itemBuilder: (_, index) 
                return CardUI(
                  postmodal[index].PostContent,
                  postmodal[index].PostUserName,
                  postmodal[index].PostDate,
                  postmodal[index].PostUserRole,
                  postmodal[index].PostTitle,
                  postmodal[index].PostUploader,
                  postmodal[index].Upin,
                );
              ),
        ),
      ),
    ));
  

  Widget CardUI(String PostContent, String PostUserName, String PostDate, String PostUserRole, String PostTitle, String PostUploader, String Upin)
  
    return Card(
      child: Container(
                child: Column(
                    children: <Widget> [
                      Text(PostUserName,),
                     Text('@'+PostUserRole,),
                      Text(PostTitle,),
                      Text(PostContent),
                ],
            ),
        ),
    );
  

【讨论】:

以上是关于为啥我的数据没有在 Flutter for web 中使用 api 从实时数据库中检索的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:为啥我的构建器在 Web 服务调用后没有重新加载?

为啥我在构建 Flutter Web 时会出现白屏

为啥在我的 Flutter Web 上使用路径 URL 策略会破坏我的导航?

Flutter For Web 从 Firestore 获取数据

为啥我的 Flutter 应用程序在执行时没有构建?

Map in Flutter for Web - 将数据从 JS 发送到 Flutter for Web