通过api调用提供程序的正确方法是什么?
我目前的设置(虽然我不知道它是否正确)是我有一个响应模型和一个Response类,并且该响应模型被传递给了响应类。 ui正在使用提供程序。这是代码:
class InfoProvider extends ChangeNotifier {
Future<Response> getSomeInfo(SomeInfo someInfo) async {
try {
final responseJson = await _provider.post('/info', someInfo.toJson());
ResponseModel someResponse = ResponseModel.fromJson(responseJson['payload']);
return Response.success(someResponse);
} catch (e) {
if (e.toString() == 'refresh_token_not_found') return Response.unauthenticated();
return Response.error(e.getError());
}
}
Future<Response> fetchInfo() async {
try {
final responseJson = await _provider.get('info');
if (responseJson['payload'].isEmpty) return Response.success([]);
AllInfoResponse alLInfoResponse = AllInfoResponse.fromJson(responseJson['payload']);
_allInfo = alLInfoResponse.AllInfoResponse;
return Response.success(alLInfoResponse);
} catch (e) {
if (e.toString() == 'refresh_token_not_found') return Response.unauthenticated();
return Response.error(e.toString());
}
} }
用户界面具有这样的未来构建器:future: Provider.of<InfoProvider>(context).getSomeInfo(),
所有工作正常,但是如何向ui添加更多项目?
这是我的模特:
class ResponseModel {
final List<SingleResponseModel> ResponseModel;
ResponseModel({this.ResponseModel});
factory ResponseModel.fromJson(List<dynamic> json) => ResponseModel(
ResponseModel: List<SingleResponseModel>.from(json.map((x) => SingleResponseModel.fromJson(x))),
);
}
class SingleResponseModel {
final String id;
final String title;
SingleResponseModel({
this.id,
this.title,
});
factory SingleResponseModel.fromJson(Map<String, dynamic> json) {
return SingleResponseModel(
id: json['_id'],
title: json['title'],
);
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['title'] = this.title;
return data;
}
}
答案 0 :(得分:2)
在您的方案中执行此操作的最佳方法是使用MultiProvider将MaterialApp包裹在main.dart文件的MyApp()中。尝试如下操作:https://pub.dev/packages/provider#multiprovider您可以在其中放置一个ChangeNotifierProvider。
以下是在用户界面中访问ResponseModel值的方法:
final model=Provider.of<ResponseModel>(context,listen:false);
别忘了添加getter和setter,以便在有依赖于它的ui时可以使用notifyListeners()。
这是您的模型的外观:
class ResponseModel extends ChangeNotifier {
List<SingleResponseModel> _myModel;
get myModel => _myModel;
set myModel(List<SingleResponseModel> myModel) {
_myModel = myModel;
notifyListeners();
}
}
这里是如何在“文本”小部件中显示数据的方法(理想情况下,您应该使用Selector而不是Consumer,以便只有在其侦听的值发生更改时才重新构建小部件):
@override
Widget build(BuildContext context) {
//other widgets
Selector<ResponseModel, int>(
selector: (_, model) => model.myModel,
builder: (_, model, __) {
return ListView.builder(
itemCount: model.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(model[index].title),
subtitle:Text(model[index].id),
);
},
);
}
)
}
希望这会有所帮助!祝你好运!