Flutter 在构建选项卡时抛出NoSuchMethodError(脏,状态:#TabsState#fefcf):方法';[]和#x27;被调用为空
对于这类错误,我已经阅读了类似的答案,但仍然无法在代码中解决它 当我点击该按钮时,它会显示一段时间的错误屏幕,然后显示loader,在提取数据时应该显示loader 代码如下:Flutter 在构建选项卡时抛出NoSuchMethodError(脏,状态:#TabsState#fefcf):方法';[]和#x27;被调用为空,flutter,dart,flutter-layout,dart-html,Flutter,Dart,Flutter Layout,Dart Html,对于这类错误,我已经阅读了类似的答案,但仍然无法在代码中解决它 当我点击该按钮时,它会显示一段时间的错误屏幕,然后显示loader,在提取数据时应该显示loader 代码如下: import 'package:flutter/material.dart'; import 'Dictionary.dart'; import 'Services.dart'; class NewTab extends StatefulWidget { @override _NewTabState cr
import 'package:flutter/material.dart';
import 'Dictionary.dart';
import 'Services.dart';
class NewTab extends StatefulWidget {
@override
_NewTabState createState() => _NewTabState();
}
class _NewTabState extends State<NewTab> {
List<Dictionary> _users;
int len;
@override
void initState() {
super.initState();
Services.getUsers().then((users) {
setState(() {
_users = users;
len = users.length - 1 ;
});
});
}
@override
Widget build(BuildContext context) {
Dictionary user = _users[len];
print(user);
return FutureBuilder(
future: Services.getUsers(),
builder: (context,AsyncSnapshot<List<Dictionary>> snapshot){
if(snapshot.data==null){
return Center(child: CircularProgressIndicator());
}else{
return DefaultTabController(length: 2,
child:Scaffold(
appBar: AppBar(
title : Text('Meaning',
style: TextStyle(
fontFamily: "Pangolin",
fontSize: 35,
)
),
centerTitle: true,
bottom: TabBar(
tabs: <Widget>[
Tab(text:'Meaning',
icon: Icon(Icons.book_outlined),
),
Tab(text:'Example',
icon: Icon(Icons.directions_transit)
),
],
),
),
body : TabBarView(
children: <Widget>[
Container(
color: Colors.white,
child: Container(
color: Colors.black,
child: ListView.builder(
itemCount: user.meanings.length,
itemBuilder: (context, index) {
print(index);
List<Meaning> mean = user.meanings;
return ListTile(
title: Text(mean[index].definitions[0].definition
, style: TextStyle(
color: Colors.white,
),
),
);
},
),
),),Container(
child: Text('home'),
),]
)
)
);
}
},
);
}
}
服务代码.dart
import 'package:http/http.dart' as http;
import 'Dictionary.dart';
import 'package:dictionary_app/home.dart';
import 'dart:async';
class Services {
static final url = 'https://api.dictionaryapi.dev/api/v2/entries/en_US/$word';
static Future<List<Dictionary>> getUsers() async {
try {
print(url);
final response = await http.get(Uri.parse(url));
print(response.statusCode);
if (200 == response.statusCode) {
final List<Dictionary> users = dictionaryFromJson(response.body);
return users;
}
else {
return <Dictionary>[];
}
} catch (e) {
return <Dictionary>[];
}
}
}
首先,您可以删除
initState
方法,因为您已经在使用FutureBuilder
获取服务。getUsers()
现在,您已经像这样定义了变量
List<Dictionary> _users;
int len;
else {
Dictionary user = snapshot.data!.last; // This gives you the last element of the array
因为,\u用户
在第一次调用build
时为空。所以,去掉这两条线
现在,剩下的代码是正确的,除了一部分
在else
的if(snapshot.data==null)
案例中,定义user
变量如下:
List<Dictionary> _users;
int len;
else {
Dictionary user = snapshot.data!.last; // This gives you the last element of the array
现在,您的代码应该可以工作了。
以下是有关
\u NewTabState
的完整代码的详细信息,您必须初始化列表
List<Dictionary> _users = [];
List<Dictionary> _users = [];
snapShot.connectionState == ConnectionState.waiting ? :