Flutter Flatter DropdownButton NoSuchMethodError:对null调用了getter值
我正试图用来自restful api的数据填充我的颤振应用程序中的下拉按钮。但是我得到了上面的错误 这是我的模型Flutter Flatter DropdownButton NoSuchMethodError:对null调用了getter值,flutter,Flutter,我正试图用来自restful api的数据填充我的颤振应用程序中的下拉按钮。但是我得到了上面的错误 这是我的模型 class SavingsCategory extends Equatable{ final int id; final String name; SavingsCategory({ @required this.id, @required this.name }); @override List<Object>
class SavingsCategory extends Equatable{
final int id;
final String name;
SavingsCategory({
@required this.id,
@required this.name
});
@override
List<Object> get props => [name, id];
}
class SavingsCategory扩展了Equalable{
最终int id;
最后的字符串名;
储蓄主义({
@需要这个.id,
@需要此名称
});
@凌驾
列表获取道具=>[name,id];
}
我的存储库正在获取数据
@override
Future<List<SavingsCategory>> getSavingsCategory()
async {
var token = await tokenRepository.getToken();
final response = await http.get(
'$baseUrl/user/savings-category',
headers: {HttpHeaders.authorizationHeader: 'Bearer $token'},
);
if (response.statusCode == 200) {
var data = json.decode(response.body);
List<SavingsCategory> categoryList = data['savingsCategory'].map<SavingsCategory>((json) {
return SavingsCategory.fromJson(json);
}).toList();
return categoryList;
} else {
throw new Exception("Couldn't get any saving categories");
}
}
@覆盖
未来的getSavingsCategory()
异步的{
var token=await tokenRepository.getToken();
最终响应=等待http.get(
“$baseUrl/用户/储蓄类别”,
标头:{HttpHeaders.authorizationHeader:'Bearer$token'},
);
如果(response.statusCode==200){
var data=json.decode(response.body);
List categoryList=data['savingsCategory'].map((json){
返回SavingsCategory.fromJson(json);
}).toList();
返回类别列表;
}否则{
抛出新异常(“无法获取任何保存类别”);
}
}
我的集团代码
class SavingsCategoryBloc {
final repository = SavingsRepository();
final _savingsCategories = PublishSubject<List<SavingsCategory>>();
Stream<List<SavingsCategory>> get savingsCategories => _savingsCategories.stream;
fetchSavingsCategories() async {
final categories = await repository.getSavingsCategory();
_savingsCategories.sink.add(categories);
}
dispose(){
_savingsCategories.close();
}
}
class SavingsCategoryBloc{
最终存储库=SavingsRepository();
最终_savingsCategories=PublishSubject();
Stream get savingsCategories=>\u savingsCategories.Stream;
fetchSavingsCategories()异步{
final categories=await repository.getSavingsCategory();
_savingsCategories.sink.add(类别);
}
处置{
_savingsCategories.close();
}
}
最后是我的小部件
class _StartSavingPageState extends State<StartSavingPage> {
final SavingsCategoryBloc bloc = SavingsCategoryBloc();
@override
void initState() {
bloc.fetchSavingsCategories();
super.initState();
}
@override
Widget build(BuildContext context) {
....
Container(
padding: EdgeInsets.symmetric(
horizontal: 15.0, vertical: 10.0),
child: StreamBuilder<List<SavingsCategory>>(
stream: bloc.savingsCategories,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return DropdownButton<String>(
items: [
DropdownMenuItem<String>(
child: Text('No Savings Category'),
value: '',
),
],
onChanged: (String value) {
setState(() {
});
},
isExpanded: true,
hint: Text(
'SAVING FOR?',
style: TextStyle(
fontSize: 15.0, color: Colors.grey),
),
);
}
return DropdownButton(
value: category,
items: snapshot.data.map((category) {
DropdownMenuItem(
child: Text('${category.name}'),
value: category.id,
);
}).toList(),
onChanged: (value) {
setState(() {
category = value;
});
},
isExpanded: true,
hint: Text(
'SAVING FOR?',
style: TextStyle(
fontSize: 15.0, color: Colors.grey),
),
);
}),
),
}
}
class_StartSavingPageState扩展状态{
最终SavingsCategoryBloc bloc=SavingsCategoryBloc();
@凌驾
void initState(){
bloc.fetchSavingsCategories();
super.initState();
}
@凌驾
小部件生成(BuildContext上下文){
....
容器(
填充:EdgeInsets.symmetric(
水平:15.0,垂直:10.0),
孩子:StreamBuilder(
流:bloc.savingsCategories,
生成器:(上下文,快照){
如果(!snapshot.hasData){
返回下拉按钮(
项目:[
下拉菜单项(
子项:文本(“无储蓄类别”),
值:“”,
),
],
onChanged:(字符串值){
设置状态(){
});
},
是的,
提示:文本(
“为……存钱?”,
样式:TextStyle(
字体大小:15.0,颜色:颜色。灰色),
),
);
}
返回下拉按钮(
值:类别,
项目:snapshot.data.map((类别){
下拉菜单项(
子项:文本(“${category.name}”),
值:category.id,
);
}).toList(),
一旦更改:(值){
设置状态(){
类别=价值;
});
},
是的,
提示:文本(
“为……存钱?”,
样式:TextStyle(
字体大小:15.0,颜色:颜色。灰色),
),
);
}),
),
}
}
如何修复此错误?我知道数据获取工作很好。我的小部件中肯定遗漏了一些东西。任何帮助都将不胜感激。DropdownButton值必须在项目值中,或者必须为空
DropdownButton(
value: categoryId,
items: snapshot.data.map((category) {
DropdownMenuItem(
child: Text('${category.name}'),
value: category.id,
);
}).toList(),
onChanged: (value) {
setState(() {
categoryId = value;
});
},
isExpanded: true,
hint: Text(
'SAVING FOR?',
style: TextStyle(
fontSize: 15.0, color: Colors.grey),
),
);