繁体   English   中英

Dart:访问class兄弟混合变量

[英]Dart: Access class sibling mixin variables

我有一个名为DatabaseService的非常大的 class,它可以获取、缓存和更新各种数据流。 我现在正试图将每个逻辑数据块分成单独的文件,以便于管理。 但是,我想通过仅提供一个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() {
  }

当我必须将数据推送到每个子服务并公开多个方法,或者如果我需要从另一个访问方法时,事情很快就会变得一团糟。

我研究过使用 mixins,它看起来很棒,但我无法访问从一个子类到另一个子类的流。

有一个更好的方法吗?

诀窍是制作一个 Base 抽象 Class,它为 class 制定了蓝图。然后让每个子类实现 class 基类,以便它们了解 class 的每个其他属性。 最后,DatabaseService 实现了基类 class 并将每个子类用作混入。

请参阅下面的示例:

基础数据库:


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));
  }
}

饲料服务:

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]));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM