flutter - 分段酒吧上市动态
问题描述
我是新手,我一直在做分段栏,暂时我已经完成了静态代码并希望做动态我在做动态列表时遇到问题,下面的代码是写的。
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()),
);
},
),
];
解决方案
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();
为什么?
告诉框架列表不固定。否则它将假定您的列表为空,因为您尚未为其分配任何默认值。
其余代码似乎很好,它应该可以工作。如果它仍然不起作用,请在评论中告诉我们。
推荐阅读
- php - MySQL中同时查询多个列
- r - 在 keras_model_sequential() 或 k_clear_session() 之后,R 中的 Keras 卡住了
- c++ - 在 C++ 中读取格式化文本文件时出现问题
- javascript - 当作为 handleSubmit 函数发送到子组件时,反应状态不更新
- javascript - Formik 表单中的某些字段未更新
- r - 是否可以使用包含字符向量(字符串)的变量来命名 tibble 的列?
- python - 使用 django usercreationform 的问题,而不是在 HTML 中呈现表单
- sql - 计算层次结构
- c++ - c ++交换数组的内容 - 选择排序
- amazon-web-services - 是否可以将 AWS cognito 托管 UI 与 Amazon Pinpoint 集成以进行分析?