5个月前,我开始为我的学校项目而发展,但遇到了问题。
我制作了一个使用 $(document).ready(function () {
var showData = $('#show-data');
$.getJSON('../undergraduate/ug.json', function (data) {
console.log(data);
var courses = data.courses.map(function (course) {
return course.code + ': ' + course.name;
});
if (courses.length) {
var content = '<li>' + courses.join('</li><li>') + '</li>';
var list = $('<ul />').html(content);
showData.append(list);
}
});
});
<body>
<a href="#" id="get-data">Get JSON data</a>
<div id="show-data"></div>
</body>
的自定义Widget
,让我们称之为 myList 小部件,它在 parentPage 中调用,然后,我添加了一个新项目从 myList 到我的数据库,然后Listview.builder()
到 parentPage ,我在这里从数据库中加载我的项目,但是 parentPage 正在重新加载 myList 及其项不是。 parentPage 和 myList 都是有状态的。
我的问题是,如何第二次构建(或初始化?) myList ,以便显示添加的项目。
我看到了类似的问题,但我不明白如何将答案应用于setState()
对不起,由于合同原因,我无法输入不允许的任何代码。
答案 0 :(得分:0)
您想从父窗口小部件调用子窗口小部件的方法,这可以使用全局键来实现。
我只是在下面的代码中演示了如何做到这一点。
class DeleteWidget extends StatefulWidget {
@override
_DeleteWidgetState createState() => _DeleteWidgetState();
}
class _DeleteWidgetState extends State<DeleteWidget> {
callme() {
print("here, you have to load data, method in delete from home1");
setState((){}); // added
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Home1(
callme: callme,
),
),
);
}
}
class Home1 extends StatefulWidget {
final Function callme;
Home1({this.callme});
@override
_Home1State createState() => _Home1State();
}
class _Home1State extends State<Home1> {
@override
Widget build(BuildContext context) {
return Container(
child: RaisedButton(
child: Text("press"),
onPressed: () {
print("here you add data in database");
widget.callme();
},
),
);
}
}
答案 1 :(得分:0)
class ParentWidget extends StatefulWidget {
@override
_ParentWidgetState createState() => _ParentWidgetState();
}
class _ParentWidgetState extends State<ParentWidget> {
List<String> items = [];
@override
void initState() {
getDataFromDataBase();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: MyList(
items: items,
refreshData: initState,
),
),
);
}
getDataFromDataBase() {
// Get Data from Database
setState(() {
for (int i = 0; i < 4; i++) {
items.add("Name $i");
}
});
}
}
class MyList extends StatefulWidget {
final Function refreshData;
List<String> items = [];
MyList({this.refreshData, this.items});
@override
_MyListState createState() => _MyListState();
}
class _MyListState extends State<MyList> {
@override
Widget build(BuildContext context) {
return Container(
child: ListView.builder(
itemBuilder: (context, index) {
return Container(
padding: EdgeInsets.all(10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(widget.items[index]),
RaisedButton(
child: Text("Add item in Database"),
onPressed: () {
addItem();
widget.refreshData();
},
)
],
),
);
},
itemCount: widget.items.length,
),
);
}
addItem() {
// Add item in database
}
}