分段酒吧列表动态

时间:2019-07-22 09:44:49

标签: flutter dart flutter-layout flutter-dependencies

我是新手,我一直在做分段游戏,因为暂时我已经完成了静态代码并希望进行动态处理,因此在向动态列表进行处理时遇到了问题,下面的代码被编写。

     import 'dart:async';
    import 'dart:convert';
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    import 'package:westerAf/paymentPage.dart';
    import 'package:http/http.dart' as http;

    class EventsPage extends StatefulWidget {
      @override
      EventsPageState createState() => new EventsPageState();
    }

    class EventsPageState extends State<EventsPage> {
      List data = List();

      String url = 'https://d57b9120.ngrok.io/api/events/westernaf/packages';
      Future<String> makeRequest() async {
        var response = await http
            .get(Uri.encodeFull(url), headers: {"Accept": "application/json"});

        setState(() {
          var extractdata = json.decode(response.body);
          data = extractdata["result"];
        });
      }

      int theirGroupValue = 0;

      final Map<int, Widget> logoWidgets = const <int, Widget>{
        0: Text('Early Bird'),
        1: Text('General'),
        2: Text('Onsite'),
      };

      static Widget giveCenter(String ListView) {
        return Container(
          child: Text(
            "Text: $ListView",
            style: TextStyle(color: Colors.blue, fontSize: 20.0),
          ),
        );
      }

     @override
  void initState() {
   super.initState(); 
    this.makeRequest();
  }

      List<Widget> bodies = [
        new ListView.builder(
          itemCount: data == null ? 0 : data.length,
          itemBuilder: (BuildContext context, i) {
            return new ListTile(
              title: new Text(data[i]["package"]),
              subtitle: new Text(data[i]["packageName"].toString()),
            );
          },
        ),
      ];

      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: bodies[theirGroupValue],
          appBar: AppBar(
            elevation: 2.0,
            backgroundColor: Colors.white,
            centerTitle: true,
            title: Text(
              'title',
              style: TextStyle(color: Colors.black),
            ),
            bottom: PreferredSize(
              preferredSize: Size(double.infinity, 45.0),
              child: Padding(
                padding: EdgeInsets.only(top: 5.0, bottom: 10.0),
                child: Row(
                  children: <Widget>[
                    SizedBox(
                      width: 15.0,
                    ),
                    Expanded(
                      child: CupertinoSegmentedControl(
                        groupValue: theirGroupValue,
                        onValueChanged: (changeFromGroupValue) {
                          setState(() {
                            theirGroupValue = changeFromGroupValue;
                          });
                        },
                        children: logoWidgets,
                      ),
                    )
                  ],
                ),
              ),
            ),
          ),
        );
      }
    }

和下面的代码,我试图做动态。我有http获取请求数据。 数据此处包含信息和数据获取错误列表。我不知道如何做动态。请帮助我弄清楚哪里出了问题。

List<Widget> bodies = [
    new ListView.builder(
      itemCount: data == null ? 0 : data.length,
      itemBuilder: (BuildContext context, i) {
        return new ListTile(
          title: new Text(data[i]["package"]),
          subtitle: new Text(data[i]["packageName"].toString() +
              ' ' +
              " price: " +
              data[i]["price"].toString()),
        );
      },
    ),
  ];

错误 enter image description here

此处数据显示为红色,表示只有静态成员才能访问init enter image description here

1 个答案:

答案 0 :(得分:1)

1)更改

@override
  void initState() {
    this.makeRequest();
  }

@override
  void initState() {
   super.initState(); 
    this.makeRequest();
  }

为什么?

initState()是一种在有状态的窗口小部件首次插入到窗口小部件树中时被称为的方法。 super.initState()转发到小部件State<T>基类的默认实现。您不能在initState方法中错过它。

2)更改

List data;

List data = List();

为什么?

告诉框架列表不固定。否则,将假定您的列表为空,因为您尚未为其分配任何默认值。

其余代码似乎还不错,它应该可以工作。在评论中让我们知道它是否仍然无效。