flutter - Flutter DropdownButton NoSuchMethodError:在 null 上调用了 getter 值
问题描述
我正在尝试使用来自我的 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];
}
我的存储库获取数据
@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");
}
}
我的集团代码
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 _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),
),
);
}),
),
}
}
我该如何解决这个错误?我知道数据获取工作得很好。我的小部件中肯定遗漏了一些东西。任何帮助,将不胜感激。
解决方案
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),
),
);
推荐阅读
- r - “数据和参考应该是同一水平的因素”,在决策树上进行交叉验证
- jquery - 使用 jQuery 将字符串替换为 div 中的 HTML
- c++ - Arduino/C++ 正确使用指针的方法
- c++ - 插入时同时遍历地图,以何种方式不安全
- javascript - 给每个元素一个不同的文本(循环,数组)
- objective-c - 目标 C 字典不返回相同的数字
- python - 使用 PyInstaller 可执行程序卡在循环中的进程
- linux - 作者如何知道具有 %100 certanity 的环境变量的地址?
- python - 多个用户的数据与单个 Twitter API 请求
- webview - 如何在屏幕更改时处理 Flutter WebviewScaffold?