【问题标题】:Dart: Access class sibling mixin variablesDart:访问类兄弟混合变量
【发布时间】:2020-12-20 18:14:24
【问题描述】:

我有一个名为DatabaseService 的非常大的类,用于获取、缓存和更新各种数据流。我现在尝试将每个逻辑数据块分成单独的文件,以便于管理。但是,我想通过仅提供一个 DatabaseService 文件来保持所有方法和流的可访问性。

我的DatabaseService 有这些不同的方法组和数据流,我将它们分成单独的文件:

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

困难在于每组数据都依赖于来自其他组数据的流。 例如,cmets 需要故事提要,等等: 评论

我的第一次迭代看起来像这样:

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,它看起来很棒,但我无法访问从一个子类到另一个子类的流。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    诀窍是创建一个基本抽象类,它为类布置蓝图。然后让每个子类实现基类,以便它们了解每个类的其他属性。最后,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]));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 2011-05-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多