我试图从服务器获取数据,然后使用列表。
我发现了有关堆栈溢出的一个相关问题,并尝试在set state方法之前使用mount属性,但这似乎不起作用。
我试图用最少的代码重新创建错误。
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class Test extends StatefulWidget {
@override
Map<String, dynamic> timelist;
State<StatefulWidget> createState() {
// TODO: implement createState
return TestState();
}
}
class TestState extends State<Test> {
void initState() {
http
.get('https://workfeed-715b8.firebaseio.com/time.json')
.then((http.Response response) {
if (mounted) {
setState(() {
widget.timelist = json.decode(response.body);
print(widget.timelist);
});
}
});
// TODO: implement initState
super.initState();
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return widget.timelist != null
? Column(
children: <Widget>[
Expanded(
child: ListView.builder(
itemCount: widget.timelist.length,
itemBuilder: (BuildContext context, int index) {
print('Hello');
print(widget.timelist.length);
}),
),
],
)
: Text('LOADING');
}
}
答案 0 :(得分:0)
我已经尝试过您的代码,并且mounted
属性可以正常工作。如果您有任何问题,可能是因为您尝试修改小部件中的属性。如果您有任何属性,则需要及时更改的属性必须处于状态类中。
另外,如果由于在卸载状态下调用setState
而出错,则可以将future
转换为stream
并取消对dispose
的订阅。完整示例如下。
class Test extends StatefulWidget {
State<StatefulWidget> createState() {
return TestState();
}
}
class TestState extends State<Test> {
String timelist;
StreamSubscription subscription;
void initState() {
subscription = http.get('https://workfeed-715b8.firebaseio.com/time.json').asStream().listen((response) {
setState(() {
timelist = json.decode(response.body);
});
});
super.initState();
}
@override
void dispose() {
subscription.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return timelist != null
? Column(
children: <Widget>[
Expanded(
child: ListView.builder(
itemCount: timelist.length,
itemBuilder: (BuildContext context, int index) {
print('Hello');
print(timelist.length);
}),
),
],
)
: Text('LOADING');
}
}
答案 1 :(得分:0)
当您尝试设置消失或替换的小部件状态的状态时,会发生此错误。
您尚未在代码中定义安装的变量,但已在if语句中使用了它。我不知道如何,但是当您用另一个小部件替换小部件并调用setState时,该条件可能成立。导致该错误的原因是,小部件在消失后会尝试设置其状态。