在 Flutter 中加载数据后,条件小部件不工作或发生变化
Conditional widget is not working or changing after data load in Flutter
我正在使用 flutter 编写一个简单的应用程序。我遇到了需要有条件地显示小部件的情况。我正在使用 应用程序脚本 API 从 Google Sheets 获取数据。我想在加载过程中显示“正在加载...”文本,并想在完成请求后隐藏它。
如果我 运行 它 within/using Android Studio,则以下代码 可以正常工作 .但是,如果我构建 APK 并将其安装到我的设备上,尽管数据已加载并存储在 listResponse 中,但屏幕上只会显示“正在加载...”文本。
class HomePage extends StatefulWidget {
const HomePage({Key? key, required this.title, required this.baseUrl}) : super(key: key);
final String title;
final String baseUrl;
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
late List listResponse = [];
Future categories() async {
var url = widget.baseUrl + 'categories';
http.Response response = await http.get(Uri.parse(url));
if(response.statusCode == 200){
setState(() {
listResponse = json.decode(response.body);
print(listResponse.toString());
});
}
}
@override
void initState(){
categories();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: TopBar(title: widget.title),
body: listResponse.isEmpty ? Center(child: Text('Loading...')) : Center(child: Text(listResponse.toString()))
);
}
}
我搜索了解决方案并在 Whosebug 上找到了一些示例。可能是什么问题,因为该应用程序正在 运行ning 正如开发中预期的那样。感谢您的帮助。
您可以使用条件值来显示加载和结果,采用 bool isSuccess = false
并在您的 statusCode==200 setState
中使其成为 isSuccess = true
class _HomePageState extends State<HomePage> {
late List listResponse = [];
bool isSuccess = false;
Future categories() async {
var url = widget.baseUrl + 'categories';
http.Response response = await http.get(Uri.parse(url));
if(response.statusCode == 200){
setState(() {
listResponse = json.decode(response.body);
isSuccess = true;
print(listResponse.toString());
});
}
}
@override
void initState(){
categories();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: TopBar(title: widget.title),
body: isSuccess ? Center(child: Text('Loading...')) : Center(child: Text(listResponse.toString()))
);
}
抓取数据时会正常工作。
或者你也可以使用 FutureBiulder
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: categories(),
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text(
'There was an error :(',
style: Theme.of(context).textTheme.headline,
);
} else if (snapshot.hasData) {
var count = json.decode(snapshot.data).length;
return Center(child: Text(listResponse.toString()));
} else {
return Center(child: Text('Loading...'))
}
});
}
我正在使用 flutter 编写一个简单的应用程序。我遇到了需要有条件地显示小部件的情况。我正在使用 应用程序脚本 API 从 Google Sheets 获取数据。我想在加载过程中显示“正在加载...”文本,并想在完成请求后隐藏它。
如果我 运行 它 within/using Android Studio,则以下代码 可以正常工作 .但是,如果我构建 APK 并将其安装到我的设备上,尽管数据已加载并存储在 listResponse 中,但屏幕上只会显示“正在加载...”文本。
class HomePage extends StatefulWidget {
const HomePage({Key? key, required this.title, required this.baseUrl}) : super(key: key);
final String title;
final String baseUrl;
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
late List listResponse = [];
Future categories() async {
var url = widget.baseUrl + 'categories';
http.Response response = await http.get(Uri.parse(url));
if(response.statusCode == 200){
setState(() {
listResponse = json.decode(response.body);
print(listResponse.toString());
});
}
}
@override
void initState(){
categories();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: TopBar(title: widget.title),
body: listResponse.isEmpty ? Center(child: Text('Loading...')) : Center(child: Text(listResponse.toString()))
);
}
}
我搜索了解决方案并在 Whosebug 上找到了一些示例。可能是什么问题,因为该应用程序正在 运行ning 正如开发中预期的那样。感谢您的帮助。
您可以使用条件值来显示加载和结果,采用 bool isSuccess = false
并在您的 statusCode==200 setState
中使其成为 isSuccess = true
class _HomePageState extends State<HomePage> {
late List listResponse = [];
bool isSuccess = false;
Future categories() async {
var url = widget.baseUrl + 'categories';
http.Response response = await http.get(Uri.parse(url));
if(response.statusCode == 200){
setState(() {
listResponse = json.decode(response.body);
isSuccess = true;
print(listResponse.toString());
});
}
}
@override
void initState(){
categories();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: TopBar(title: widget.title),
body: isSuccess ? Center(child: Text('Loading...')) : Center(child: Text(listResponse.toString()))
);
}
抓取数据时会正常工作。
或者你也可以使用 FutureBiulder
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: categories(),
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text(
'There was an error :(',
style: Theme.of(context).textTheme.headline,
);
} else if (snapshot.hasData) {
var count = json.decode(snapshot.data).length;
return Center(child: Text(listResponse.toString()));
} else {
return Center(child: Text('Loading...'))
}
});
}