微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Flutter中将提供程序模式与数据库一起使用

如何解决在Flutter中将提供程序模式与数据库一起使用

我是新手,尤其是提供者模式。我浏览了有关提供程序模式状态管理的文档,示例和一些教程,我试图在我的一个项目中实现它。我正在开发个人支出经理应用程序。问题在于,所有文档,示例和教程都假定模型提供者在内存中具有所有必需的数据,也就是说,列表中已经存在所有模拟数据。很容易理解数据的添加/删除和更改通知。但是在实际应用中,需要从本地数据库或Internet加载数据。那就是当事情变得混乱和混乱的时候。这是我的模型:


    class Expense {
      int id;
      String name;
      DateTime date;
      double amount;
      PaymentType paymentType; //This is an enum (card,cash etc.)
      ExpenseCategory category; //Categories like fuel,groceries etc.
    
      Expense({@required this.name,@required this.date,@required this.amount,@required this.paymentType,@required this.category});
    }
    
    class ExpenseCategory {
      int id;
      String name;
    
      ExpenseCategory({@required this.name});
    }

数据操作类:


    class ExpenseRepository {
      static Future<List<Expense>> getAllExpenses({@required int month}) async {
        return await mockService.getAllExpensesData(month: month);
      }
    
      static Future<List<Expense>> getRecentExpenses() async {
        return await mockService.getRecentExpensesData();
      }
    
      static Future<List<CategorywiseAmount>> getCategorywiseExpensesList({@required int month}) async {
        return await mockService.getCategorywiseExpensesListData(month: month);
      }
    
    }

目前,数据是从模拟服务加载的,该服务将被本地数据库替换。不过,它模拟了异步/等待模式。

在查看上面的代码时,我有以下问题:

  1. 我是否必须将“费用”模型转换为提供程序(“费用”和“费用”提供程序),还是必须创建一个单独的类来充当提供程序?在文档和教程中,我已经看到模型已转换为提供程序,但这是正确的做法吗?我可能是错的,但是我认为关注点分离将被违反。据我所读,除了成为模型之外,模型不应做任何其他事情。

  2. 费用提供者实际上如何从数据库(或我的模拟数据库)中加载数据?如果我遵循这些教程,则必须拥有这样的提供者:


    class ExpensesProvider with ChangeNotifier {
        List<Expense> _expensesList;
        List<Expense> get recentExpenses {
            return _expensesList;
        }
    }

但是,提供程序将如何将数据从模拟数据库加载到_expensesList属性中,因为模拟方法getRecentExpenses()返回的是Future(而实际方法也将返回)并且不能在getter中使用。还是我也必须从吸气剂本身返回未来?

  1. 如果添加了新费用,则最近费用列表应自动更新。让我们暂时假设此提供程序已以某种方式挂接到数据库我有以下疑问: a)提供程序是否监视数据库中的更改,还是监视内存模型/列表中的更改并自动触发重建? b)也许它不监视以上任何内容,而我们需要使用notifyListeners手动触发它? 困惑来自评论

    // Consumer looks for an ancestor Provider widget
    // and retrieves its model (Counter,in this case).
    // Then it uses that model to build widgets,and will trigger
    // rebuilds if the model is updated.

这些评论来自Flutter示例应用https://github.com/flutter/samples/blob/master/provider_counter/lib/main.dart

  1. 我是否还在使用正确的工具?我的意思是说,也许还有其他东西可以代替提供程序(但具有类似或更多功能)与本地/数据库一起使用,以简化流程。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。