flutter - Dart:访问类同级混合变量

标签 flutter dart

我有一个称为DatabaseService的非常大的类,可以读取,缓存和更新各种数据流。我现在正尝试将每个逻辑数据块分成单独的文件,以使其更易于管理。但是,我想通过仅提供一个DatabaseService文件来保持所有方法和流的可访问性。
我的DatabaseService具有这些不同的方法组和数据流,我将它们分为单个文件:

  • 用户
  • 饲料
  • 的故事
  • 评论

  • 困难在于每个数据组都依赖于其他数据组的流。
    例如,评论需要故事提要,依此类推:
    评论<故事<提要<用户
    我的第一次迭代如下所示:
    class DatabaseService {
      // Here, i expose the various streams from each subclass
      Stream<User> userStream = UserService.instance.userStream;
      Stream<Feed> feedStream = FeedService.instance.feedStream;
      Stream<Stories> storiesStream = StoriesService.instance.storiesStream;
      Stream<Comments> commentsStream = CommentsService.instance.commentsStream;
      ...
    
      DatabaseService() {
      }
    
    当我必须将数据推送到每个子服务并公开多个方法时,或者如果我需要彼此访问方法时,事情很快就会变得困惑。
    我已经研究过使用mixin,它看起来很棒,但是我无法访问从一个子类到另一个子类的流。
    有一个更好的方法吗?

    最佳答案

    诀窍是制作一个基本抽象类,该抽象类为该类设计蓝图。然后,让每个子类实现基类,以便它们在每个类中都知道该类的其他属性。最后,DatabaseService实现了基类,并将每个子类用作mixins。
    参见以下示例:
    基础数据库:

    
    abstract class BaseDatabase {
      final firestore = FirestoreService.instance;
      final functions = FunctionsService.instance;
    
      ValueStream<User> userStream;
      Future<void> setUser(User user);
    
      Stream<Feed> feedStream;
      Stream<Story> storiesStream;
      Stream<List<Comment>> commentsStream;
      Stream<Location> locationStream(String locationId);
    }
    
    数据库服务:
    part 'parts/feed.dart';
    
    class DatabaseService extends BaseDatabase
        with
            UserService,
            LocationService,
            FeedService,
            CommentsService,
            ... {
    
      DatabaseService({authService}) {
        // Any other required initialization code here, for example something like this.
        authService.uid().listen((uid) => userId.add(uid));
      }
    }
    
    FeedService:
    part of '../database_service.dart';
    
    mixin FeedService implements BaseDatabase {
      ValueStream<Feed> get feedStream => _getFeedStream().shareValue();
    
      Stream<Feed> _getFeedStream() => 
        // userStream is from the UserService.. Winning!
        userStream
          .distinct((oldUser, newUser) => oldUser.id == newUser.id)
          .switchMap((user) => firestore.get(...)
            .where((feeds) => feeds.length > 0)
            .map((feeds) => feeds[0]));
    

    关于flutter - Dart:访问类同级混合变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63690913/

    相关文章:

    uri - `dart:uri`现在在哪里?

    Dart 单元测试不适用于 content-shell

    flutter - 如何在 Flutter 中使用动画更改行/列状态?

    flutter - 水平居中图像,垂直重复

    flutter - 将 RTL 添加到 ListView.builder 水平抖动

    dart - Flutter - 对齐表格中的文本

    flutter - Dart 以交替方式组合两个列表

    dart - Dart 在事件函数中是否有像 jQuery on() 这样的 childSelector?

    database - 首次在sembast中创建商店初始化

    android - 如何在 Flutter 中将文件从本地存储导入到数据库中