【问题标题】:how to use singleton firebase service on Flutter?如何在 Flutter 上使用单例 Firebase 服务?
【发布时间】:2020-04-17 07:52:08
【问题描述】:

我有 4 页。我每 4 页调用一次getRide() 方法。这意味着 4 次数据库调用。我对吗?是否可以为这种情况创建一个单例?

Firebase 服务

class FirebaseService {
    final Firestore _db = Firestore.instance;

    Stream<List<RideModel>> getRide() {
        return _db.collection('ride')
               .snapshots()
               .map((list) => list.documents.map((doc) => RideModel.fromFirestore(doc))
               .toList());
    }
}

调用方法

@override
void initState() {
   super.initState();
   db.getRide().listen(getRide);
}

void getRide(List<RideModel> model) {
    if (!mounted) return;
    setState(() {
       rideModel = model;
    });
}

我无法通过 Navigator 传递 rideModel。因为在乘车集合中更改数据时需要更改 4 页 UI。

【问题讨论】:

  • 您可以使用Provider,其中包含您要显示的数据,当Stream 获取新数据时,您将其添加到Provider 和代码的其他3 部分中,您可以使用Consumer 收听这些数据。所以,这样你只听一次流。
  • @CopsOnRoad 好的,谢谢。添加这样的数据selectNotifier.value.add(productModel); 对吗?我的回答错了吗?
  • 你的模型应该有 List 形式的数据。当数据到达流中时,首先使用 Provider.of 获取对您的提供者的引用,然后访问 List 并在其上使用 .add ,从而将该数据添加到列表中。我正在打电话,所以帮不了你。
  • @CopsOnRoad 好的。谢谢你。我会尽力让你知道

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

有人告诉我这个答案对于上述问题是正确的。

我找到了解决这个问题的方法。

我使用了 get_it 包并创建了服务定位器,

GetIt locator = GetIt.instance;

void setupSingletons() async {
  locator.registerLazySingleton<FirebaseService>(() => FirebaseService());
}

然后添加到主类中

void main() {
  setupSingletons();

  runApp(MultiProvider(
    providers: globalProviders,
    child: MyApp(),
  ));
}

我添加的每个屏幕,

class _Screen1 extends State<Screen1> {
//  final db = FirebaseService();
  FirebaseService db = GetIt.I.get<FirebaseService>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 2021-01-15
    • 2019-09-27
    • 2019-05-20
    相关资源
    最近更新 更多