在flutter中将项目添加到提供程序

时间:2020-08-16 04:17:23

标签: flutter

通过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;
  }
}

1 个答案:

答案 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),
       );
     },
   );
  }
 )
}

希望这会有所帮助!祝你好运!