flutter initstate()列表未访问其他类小部件

时间:2018-11-25 19:16:08

标签: android ios dart flutter

我正在创建一个扑朔迷离的应用程序。我想从Firebase提取数据并显示网格视图。数据正在从Firebase正确获取。在initState()中获取数据,但未更新TheGridview的另一个类_MyHomePageState。我正在使用一个变量  documents用于存储Firebase中的列表。 initState()记录了值,但是在方法createchildwidget中,该文件为空。我尝试了很多方法,请帮帮我。代码如下所示。

    import 'dart:async';
    import 'package:flutter/material.dart';
    import 'package:augr/location/LocationScreen.dart';
    import 'package:cloud_firestore/cloud_firestore.dart';

    void main() => runApp(MyApp());

    class MyApp extends StatelessWidget {
      // This widget is the root of your application.

      MyApp({this.firestore});
      final Firestore firestore;


      @override
      Widget build(BuildContext context) {
        return MaterialApp(
            home: MyHomePage(title: 'My Shop', firestore: firestore)
        );
      }
    }

    class MyHomePage extends StatefulWidget {

      MyHomePage({Key key, this.title, this.firestore}) : super(key: key);
      final Firestore firestore;
      final String title;

      @override
      _MyHomePageState createState() => new _MyHomePageState(firestore: firestore);
    }

    class _MyHomePageState extends State<MyHomePage> {
      _MyHomePageState({this.firestore});
      final Firestore firestore;
      var documents = [];

      void initState(){
        Firestore.instance.collection("messages").getDocuments().then((data) async{
          var list = data.documents;
          documents = list;
          print("init state document:"+documents.length.toString());  // value is getting
          super.initState();
          setState((){
            documents = list;
          });
        });



      }

      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(
            iconTheme: IconThemeData(
              color: Colors.black, //change font color here
            ),
            backgroundColor: new Color(0xFFFAFAFA),
          )
          title:"title",
          body: TheGridview().build(),
        );
      }
    }

    class TheGridview extends _MyHomePageState{
      Card makeGridCell(String name, IconData icon){
        return Card(
          elevation: 1.0,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            mainAxisSize: MainAxisSize.min,
            verticalDirection: VerticalDirection.down,
            children: <Widget>[
              Center(child: Icon(icon)),
              Text(name)
            ],
          ),
        );
      }

      @override
      Widget build(BuildContext context) {
        return GridView.count(
          primary: true,
          padding: EdgeInsets.all(1.0),
          crossAxisCount: 2,
          childAspectRatio: 1.0,
          mainAxisSpacing: 1.0,
          crossAxisSpacing: 1.0,

          children: createchildwidget(),

          /*  children: <Widget>[
            makeGridCell("Home", Icons.access_alarm)
          ],*/


        );
      }

      List<Widget> createchildwidget(){
        print("createchildwidget:"+documents.length.toString()); // the value getting 0
        List<Widget> createchildwidget = List<Widget>();
        for(int i=0;i<documents.length;i++){
          createchildwidget.add(TheGridview().makeGridCell(makeGridCell(data[i].data['message'], Icons.access_alarm));

        }
        return createchildwidget;
      }


    }

2 个答案:

答案 0 :(得分:0)

在加载数据时尝试使用其他小部件:

        @override
          Widget build(BuildContext context) {
            return documents.isEmpty? Center(child: CircularProgressIndicator()) : GridView.count(
              primary: true,
              padding: EdgeInsets.all(1.0),
              crossAxisCount: 2,
              childAspectRatio: 1.0,
              mainAxisSpacing: 1.0,
              crossAxisSpacing: 1.0,
              children:  : createchildwidget(),

              /*  children: <Widget>[
                makeGridCell("Home", Icons.access_alarm)
              ],*/

            );
          }

答案 1 :(得分:0)

与其将TheGridView设为新类,不如将其设为一个函数,并在加载document数据时调用它。 试试这个:

    import 'dart:async';
    import 'package:flutter/material.dart';
    import 'package:augr/location/LocationScreen.dart';
    import 'package:cloud_firestore/cloud_firestore.dart';

    void main() => runApp(MyApp());

    class MyApp extends StatelessWidget {
      // This widget is the root of your application.

      MyApp({this.firestore});
      final Firestore firestore;


      @override
      Widget build(BuildContext context) {
        return MaterialApp(
            home: MyHomePage(title: 'My Shop', firestore: firestore)
        );
      }
    }

  class _MyHomePageState extends State<MyHomePage> {
      _MyHomePageState({this.firestore});
      final Firestore firestore;
      var documents = [];
bool isDocLoaded=false;
      void initState(){
        Firestore.instance.collection("messages").getDocuments().then((data) async{
          var list = data.documents;
          documents = list;
          print("init state document:"+documents.length.toString());  // value is getting
          super.initState();
          setState((){
            isDocLoaded=true;
            documents = list;
          });
        });



      }

      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(
            iconTheme: IconThemeData(
              color: Colors.black, //change font color here
            ),
            backgroundColor: new Color(0xFFFAFAFA),
          )
          title:"title",
          body: isDocLoaded? TheGridview():Center(child:CircularProgressIndicator()),
        );
      }

Widget TheGridView(){
return GridView.count(
          primary: true,
          padding: EdgeInsets.all(1.0),
          crossAxisCount: 2,
          childAspectRatio: 1.0,
          mainAxisSpacing: 1.0,
          crossAxisSpacing: 1.0,

          children: createchildwidget(),

          /*  children: <Widget>[
            makeGridCell("Home", Icons.access_alarm)
          ],*/
);
}

Card makeGridCell(String name, IconData icon){
        return Card(
          elevation: 1.0,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            mainAxisSize: MainAxisSize.min,
            verticalDirection: VerticalDirection.down,
            children: <Widget>[
              Center(child: Icon(icon)),
              Text(name)
            ],
          ),
        );
      }
List<Widget> createchildwidget(){
        print("createchildwidget:"+documents.length.toString()); // the value getting 0
        List<Widget> createchildwidget = List<Widget>();
        for(int i=0;i<documents.length;i++){
          createchildwidget.add(makeGridCell(makeGridCell(data[i].data['message'], Icons.access_alarm));
        }
return createchildwidget;
      }
    }