【问题标题】:Flutter: Create object stream from Hive boxFlutter:从 Hive 盒创建对象流
【发布时间】:2020-10-27 21:43:28
【问题描述】:

我正在尝试访问一些在整个应用程序中更改和访问的用户设置。为此,我使用 Hive 从框中检索用户设置。我想通过将从Hive.box('settings').get(userID) 检索到的UserSettings 对象转换为将被馈送到StreamProvider 的流,从而在整个应用程序中访问该信息。

我将如何将Hive.box('settings').get(userID) 转换为流?

编辑:到目前为止,这是我的代码实现:

local_database.dart

static Stream<UserSettings> get userSettings {
  return Hive.box('settings').watch(key: userID)?.map((boxEvent) {
    return boxEvent.value; // ========> value is always null from boxEvent
  });
}

static void saveUserSettings(UserSettings userPref) {
  Hive.box('settings').put(userID, userPref); 
}

main.dart

class Launch extends StatefulWidget {
  @override
  _LaunchState createState() => _LaunchState();
}

class _LaunchState extends State<Launch> {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        StreamProvider<User>.value(value: AuthService.user),
        StreamProvider<UserSettings>.value(value: LocalDatabase.userSettings),
      ],
      child: MaterialApp(
        title: 'MyApp',
        home: AuthWrapper(),
      ),
    );
  }

settings.dart

class SettingsScreen extends StatefulWidget {
  @override
  _SettingsScreenState createState() => _SettingsScreenState();
}

class _SettingsScreenState extends State<SettingsScreen> {
  UserSettings _settings;

  @override
  Widget build(BuildContext context) {
    _settings = Provider.of<UserSettings>(context);

    print(_settings.useLightTheme); // =====> Always returns null

    return Scaffold(
      appBar: AppBar(title: 'Settings'),
      body: Container()
    ),
  }
}

【问题讨论】:

    标签: flutter dart asynchronous flutter-hive


    【解决方案1】:

    this issue 我可以假设没有办法在手表上获取初始值,只有listenable 才有可能:

    ValueListenableBuilder(
      valueListenable: Hive.box('settings').listenable(),
      builder: (context, box, widget) {
        return Center(
          child: Switch(
            value: box.get('darkMode', defaultValue: false),
            onChanged: (val) => box.put('darkMode', val),
          ),
        );
      },
    )
    

    【讨论】:

    • 我打算用它来实现一个最喜欢的产品选项。它将如何消耗资源?
    • 我从未测试过关键应用程序。但是不同类型的产品有不同数量的喜欢的动作,考虑一下。还有一些东西可以帮助你使用lazy box
    【解决方案2】:

    使用box.watch()

    接下来是一个伪代码,只是举例

    Stream<User> listen() => box
          .watch(userID)
          .map(...) // somehow map your User
          .startWith(box.get(userID)); // initial value before any changes
    

    PS 如果您在实施过程中遇到困难,请在 cmets 中与我联系以寻求帮助

    PS 2:startWith 方法是 rxdart 包提供的扩展,所以请记住这一点

    【讨论】:

    • 我尝试实现你的伪代码,我可以得到一个 Stream,但是 BoxEvent 的初始值始终为空,即使我检查并已经在盒子中存储了一些东西。由于某种原因,初始值始终为空。请看帖子编辑
    猜你喜欢
    • 2022-11-28
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    相关资源
    最近更新 更多