Flutter Flatter DropdownButton NoSuchMethodError:对null调用了getter值

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>

我正试图用来自restful api的数据填充我的颤振应用程序中的下拉按钮。但是我得到了上面的错误

这是我的模型

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),
  ),
);