如何使用嵌套数据模型向提供者提供数据[列表>项目>子列表>子项目]

时间:2020-04-29 07:55:42

标签: flutter flutter-provider

我开始使用提供程序包进行状态管理,并以一种基本方式使用它。 随着应用程序变得越来越复杂,我想扩展使用范围。

现在我想到的是这种模型结构:List<Client>具有List<Product>(更深层次的是List<Component>)。

我有一个为客户端使用ChangeNotifierProvider的MultiProvider,这意味着List<Client>由提供商管理,到目前为止一切顺利。

现在,我想直接在提供者中使用List<Product>,或者稍后在List<Component>中使用List<Product>。我不想遍历List<Client> ...到组件。

这里有一张图片map of the structure可以显示。

这是一些简化的代码:

    // Just an example idea of..

Class Product with ChangeNotifier {
  final String title;  
}

Class Client with ChangeNotifier {
  final String name;
  final String List<Product>;
}


Class Clients with ChangeNotifier {
  final List<Client> _items;

}


void main()  { 
    // start the app
  runApp(MyApp());
}
class MyApp extends StatelessWidget {

@override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (ctx) => Clients()),  

        // How to provide a List<Product> that actually in the model 
        // belongs to a Client in the List<Client>

      ],
      child: MaterialApp(
        body: ...
      )
      );   
  }
}

所以主要问题是如何提供模型中实际的List<Product> 属于List<Client>中的客户?

1 个答案:

答案 0 :(得分:0)

感谢您在评论中的帮助。

似乎有两种可能的解决方案。

  1. 请勿使用嵌套结构。这可以通过将父代的ID保留在嵌套之前列表中并将其扔出父代列表之外来实现。然后为其提供一个自己的ChangeNotifierProvider,并在需要时按父ID过滤项目。

因此在我的示例中,列表和列表处于同一级别,并且都具有 ChangeNotifierProvider。 The product model holds the id of it's client,并且列表具有方法getbyClientId(clientId),该方法将导致筛选出的产品列表到达指定的客户端。就是这样。

  1. 使用ChangeNotifierProxyProvider 将请求委派到嵌套列表中。

我选择了第一种方法,因为在我看来,这是正确的方法。经过一段时间的努力,我不能说这是一个错误的决定,所以我可以自由选择。

在其他情况下,第二种方法可能更好。我没有在ChangeNotifierProxyProvider上投入太多时间,所以请查看其他来源以获取更多详细信息。