首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Flutter :如何在多页面中使用带有SharedPreference和List<String>变量的Riverpod?

Flutter是一种用于构建跨平台移动应用程序的开源框架。它使用Dart编程语言,具有快速开发、高性能和漂亮的用户界面设计等特点。Flutter通过使用单一代码库可以同时在iOS和Android平台上运行,并提供了丰富的开发工具和组件来简化开发过程。

在多页面中使用带有SharedPreference和List<String>变量的Riverpod,你可以按照以下步骤进行操作:

  1. 首先,确保你已经安装了Riverpod和SharedPreference的依赖库。在pubspec.yaml文件中添加以下依赖项并运行flutter packages get
代码语言:txt
复制
dependencies:
  riverpod: ^0.15.0
  shared_preferences: ^2.0.6
  1. 创建一个名为app_state_provider.dart的文件,并在其中定义一个Provider来管理你的状态。这个Provider将使用SharedPreference来存储和读取数据。以下是一个示例:
代码语言:txt
复制
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';

final sharedPreferencesProvider = Provider<SharedPreferences>((ref) {
  throw UnimplementedError();
});

final myDataListProvider = Provider<List<String>>((ref) {
  final sharedPreferences = ref.watch(sharedPreferencesProvider);
  final dataList = sharedPreferences.getStringList('dataList');
  return dataList ?? [];
});

final saveDataListProvider = Provider<VoidCallback>((ref) {
  final sharedPreferences = ref.watch(sharedPreferencesProvider);
  return () async {
    // 从Riverpod的Provider中获取数据列表
    final dataList = ref.read(myDataListProvider).state;
    await sharedPreferences.setStringList('dataList', dataList);
  };
});
  1. 在你的应用程序中的任何页面中,你可以使用ConsumerProviderListener小部件来访问和操作这些Provider。以下是一个使用Consumer小部件的示例:
代码语言:txt
复制
Consumer(
  builder: (context, watch, _) {
    final dataList = watch(myDataListProvider);
    return ListView.builder(
      itemCount: dataList.length,
      itemBuilder: (context, index) {
        return ListTile(
          title: Text(dataList[index]),
          onTap: () {
            // 点击时删除数据列表项
            final updatedList = dataList.toList()..removeAt(index);
            context.read(myDataListProvider).state = updatedList;
            context.read(saveDataListProvider)();
          },
        );
      },
    );
  },
)

在上面的示例中,我们使用Consumer小部件来监听myDataListProvider并更新UI。通过调用context.read(myDataListProvider).state来获取和设置数据列表的值,并通过调用context.read(saveDataListProvider)来保存数据列表到SharedPreference中。

总结一下,使用Riverpod和SharedPreference在多页面中使用带有SharedPreference和List<String>变量的方法如上所示。你可以根据具体的需求进行调整和优化。对于更多关于Flutter开发和Riverpod的信息,可以参考腾讯云的相关产品和文档:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

重走Flutter状态管理之路—Riverpod入门篇

其实Provider在使用上已经非常不错了,只不过随着Flutter更加深入,大家对它需求也就越来越高,特别是对Provider因为InheritedWidget层次问题导致异常BuildContext...,理清这些Provider不同作用使用场景,对于我们用好Riverpod是非常有帮助。...在Riverpod,我们不像package:Provider那样需要依赖BuildContext,取而代之是一个「ref」变量。...这是通过ref.watch完成 在一个Provider上添加一个监听器,以执行一个action,导航到一个新页面或在该Provider发生变化时执行一些操作。...然而,如果它们是相等(例如当年龄改变时),Riverpod将不会重建Widget。 这个场景也可以使用selectref.listen。

2.9K20

Riverpod - flutter 状态管理应用

`, 我们可以在享受 hooks 同时,直接使用`Widget.ref(provider).watch` 来监听变更并自动刷新页面。...## 为什么 Flutter 需要状态管理Flutter 作为优秀跨端框架,其使用声明式UI有诸多优势,但嵌套组件给数据传递带来了极大挑战。...#### 组件分离但是 多数情况下, 我们需要渲染页面改变数据按钮 并不在一个组件,例如,如果我们将这个按钮单独封装在一个类。这种情况下,我们应该如何在点击按钮时候增加数据呢?...ChangeNotifyChangeNotify 是 Flutter 下用于监听数据变更组件,在这个场景下,我们可以使用其监听 counter 变化, 并重新渲染页面```dartclass Counter...先添加如下依赖 (这里使用 Flutter_hooks 举例)```yamldependencies: flutter_hooks: ^0.20.5 hooks_riverpod: ^2.5.1 riverpod_annotation

12710
  • flutter响应式布局

    flutter,我们可以根据UI设计效果,通过使用不同技术、widgets第三方包,轻松实现响应式 In this article, we'll focus on one very specific...,并介绍如何在大屏幕手机上使用如下布局方式: 大屏幕 手机屏幕使用drawer 就像我们看到,在不同屏幕尺寸,我们需要不同布局方式...在web开发我们可以使用css很容易实现这种效果。下面我们就来看看在flutter是如何实现吧! 我们将实现如下简单功能: 点击左上角icon打开(点击返回按钮关闭)....目标 #2: 通过 Riverpod实现页面切换 我们需要通过菜单来切换页面,所以我们使用 Riverpod package来实现全局应用状态管理,当然我们也可以使用其他状态管理。...我们这里使用riverpod,在 pubspec.yaml引入: dependencies: flutter: sdk: flutter flutter_riverpod: 1.0.0-

    2.8K10

    2021 年值得期待 Flutter 数据流管理方案

    不像 Redux 在 React 独占鳌头,Flutter 数据流管理方案层出不穷,本文旨在介绍在2021年值得使用 Flutter 数据流管理方案,除了大家都比较熟悉 InheritedWidget... provider, 还有 Remi Rousselet 新推出、令人十分期待 Riverpod。...3.4 封装通用页面容器 在 业务场景,绝大多数页面都是需要通过 api 请求获取数据,根据返回结果页面显示:加载、正常页面、空状态、网络错误、其他错误这么几种情况。...因此,可以抽象把这个过程抽离出一个通用容器,注意Flutter UI 型组件设计倾向于组合而不是继承,而对于功能型组件则使用继承 mixin。...使用人数,比较稳定 1. provider 是依赖于 Flutter ,依赖注入会与 UI 代码耦合2.

    2K20

    实现Flutter应用全局导航栏效果

    因此,设计一个清晰、易用导航栏对于提升用户体验应用可用性至关重要。 在Flutter应用开发,实现全局导航栏效果意味着无论用户在应用哪个页面,导航栏内容状态都保持一致。...在Flutter应用中集成Riverpod 要在Flutter应用中使用Riverpod状态管理器,首先需要在项目的pubspec.yaml文件添加riverpod依赖: dependencies...我们使用了ProviderScope来初始化Riverpod,它是Riverpod一个重要组件,用于创建Provider共享状态。...当导航栏状态发生变化时,页面会自动更新。Riverpod使用方法与Provider相似,但更加灵活强大,适用于更复杂应用场景。...如何使用InheritedWidget实现全局导航栏效果 要使用InheritedWidget实现全局导航栏效果,可以将导航栏状态提升到InheritedWidget,并在需要使用导航栏页面访问更新导航栏状态

    11611

    Flutter 刷新页面:通过下拉刷新提升用户体验

    在丰富挂件Flutter 提供了一个很好方式实现下拉来刷新应用。这个手势,对很多用户来说很熟悉,就是下拉页面来触发更新动作,获取新数据并更新屏幕展示。...下拉更新基础 下拉刷新是应用移动端一个常见模式,它允许用户手动刷新页面内容。在 Flutter ,这个功能被封装在 RefreshIndicator 挂件。...使用 BuildContext 来管理状态导航 BuildContext 是 Flutter 基本概念,它表示一个挂件在 widget tree 位置。...List newData = await fetchData(); setState(() { // 使用新数据更新我们数据列表 items = newData...在复杂 Flutter 应用程序拉动刷新 在更复杂 Flutter 应用程序,下拉刷新可能多个状态层和数据源有交互。在这种场景,实现一个能够处理复杂性有强大状态管理解决方案至关重要。

    21110

    Flutter BottomNavigation 底部导航详解 及问题记录

    以及是否粘贴到底部,导航个数 在app页面,home指向底部导航栏组件 home: BottomNavigation(), 底部导航栏组件集成 StatefulWidget 在内部创建一个带有状态组件...StatefulWidget { @override _BottomNavigationState createState() => _BottomNavigationState(); } 状态组件内有一些颜色变量选中导航索引变量...查看预设颜色值 在icons.dart查看预设图标 源码 三个文件 main.dart import 'package:flutter/material.dart'; import '....void关键字修饰, 使用setState 来修改内部变量 问题1: 假如页面停留在首页, 此时来了一个消息,需要在消息导航栏上加上徽标,该如何处理?...问题2: 假如现在要做换肤功能,那要如何做? 问题3: 目前dart辨析时候,有很多括号, 格式不够优美,有没有第三方,成熟组件以供使用 问题4: 如何在页面切换时 ,使用动画,自己写?

    3.2K10

    Flutter 旋转轮

    在在本文中,我们将探讨 “Flutter 旋转轮”。我们还将在flutter应用程序中使用flutter_spinwheel」包来实现带有自定义选项「Spinwheel」演示程序。...pub 地址:https://pub.dev/packages/flutter_spinwheel 效果演示: 该演示视频展示了如何在Flutter使用自旋轮。...它显示了如何在flutter应用程序中使用flutter_spinwheel」软件包运行「旋转轮」,并显示了当您点击该项目时,旋转器将移动。同样,您将沿顺时针/逆时针任何方向移动微调器。...**方法 初始化所有变量,例如问题,选择,选择答案。...他子属性,我们将添加一个列小部件。在此小部件,我们将添加两个文本,分别是问题答案。

    8.8K20

    Flutter局部刷新三剑客

    局部刷新作为提高Flutter页面性能重要手段,是每一个Flutter老手都必须掌握技巧。...当然,我们不用非得使用Riverpod、Provider、Bloc这些状态管理工具来实现局部刷新,Flutter框架本身也给我们提供了很多方便快捷刷新方案,今天要提就是Notifier三剑客,用它来处理局部刷新...ValueNotifier 在使用ChangeNotifier时候,每次在修改变量时,都需要手动调用notifyListeners()方法,所以,Flutter创建了一个新组件——ValueNotifier...这样不仅简化了代码模板,而且不再使用setState来进行页面刷新。 ValueListenableBuilder作为一个非常经典Widget,在它注释,就有很多教程示例。...这个优化方案非常经典,在Flutter很多地方都有使用这个技巧,特别是动画这块处理。

    15810

    记住,永远都不要在 Flutter使用全局变量

    以上所有原因都说明了为什么在 Flutter 永远不应该使用全局变量。...在本文中,我们将详细了解全局变量缺点,并学习如何以更有效方式管理状态。 Flutter 全局变量是什么? 全局变量是公共变量,可以被 Flutter 程序每个方法对象访问。...Flutter使用全局变量缺点 在 Flutter使用全局变量一直受到质疑批评,通常被认为是不好做法。以下是使用全局变量缺点: 1....如果有必要使用全局变量,至少使它们不可变。 在下一部分,你将学习状态管理库包,它们提供了以更好方式管理变量状态更好方法,而不会影响维护过程。...要在 Flutter 应用程序启动开始使用 GetX,请将 get 添加到你 pubspec.yaml 文件: dependencies: get: 接下来,导入使用 GetX 库函数组件时需要

    3.5K30

    深入探究Flutter页面导航器:Navigator详解

    下面我们来学习如何在Flutter中进行页面路由导航,以及如何使用Navigator.pushNavigator.pop进行页面的跳转返回操作。 1....命名路由使用可以使代码更清晰、更易维护,尤其是在大型应用具有很好可读性扩展性。下面我们将介绍命名路由概念用法,并演示如何在Flutter应用配置使用命名路由。 1....本节将探讨如何在Flutter中保持页面状态,并演示使用AutomaticKeepAliveClientMixinKeepAlive来实现路由保持状态方法。 1....导航器嵌套允许我们在一个页面内部创建多个导航器,并分别管理它们之间导航栈,从而实现更灵活复杂页面管理。本节将学习如何在Flutter应用实现导航器嵌套,并演示如何在多个导航器之间进行导航。...在Flutter,可以通过路由参数传递数据,也可以通过全局状态管理器(Provider、Riverpod等)来共享数据。

    96310

    flutter架构:Repository设计模式

    在软件开发,我们可以使用设计模式有效解决我们软件设计常见问题。而在app架构,「structural」设计模式可以帮助我们很好划分应用结构。...本文中我们将详细讲解「Repository设计模式,「包含以下部分」:」 「Repository设计模式」是什么以及何时使用使用「具体」「抽象」类实现以及如何权衡使用 如何使用「Repository...❝如果在Widget中直接使用来自REST API 或远程数据库key-value,这样做是有很大风险。换句话说:不要将业务逻辑与您 UI 代码混合,这会使你代码更难测试、调试推理。...Riverpod import 'package:flutter_riverpod/flutter_riverpod.dart'; final weatherRepositoryProvider =...优点 「:」 完全可以使用不同实现 ****,替换时只需要更改初始化时一行代码。 缺点**:**当我们在IDE点击“跳转到引用”时只能到抽象类方法定义而不是具体类实现。

    2.6K30

    Flutter Platform Channels(一)

    因此,虽然Flutter邀请你在Dart编写app,但你依然可以在宿主app中使用Java/Kotlin或*Objective-C/Swift执行尽可能操作,直接调用平台特定API。...channels 从最基本层面上来讲,Flutter通过使用带有二进制消息异步消息与平台代码进行通信 - 这意味着消息有效负载是一个byte buffer。...---- 使用二进制消息,你需要考虑十分精细细节,字节序以及如何使用字节表示更高级别的消息,字符串或映射。 每当要发送消息或注册handler时,还需要指定正确通道名称。...以下代码显示了如何在Dart,AndroidiOS两个方向上使用message channel: // String messages // Dart side const channel = BasicMessageChannel...(msg2); 但是如果处理一个带有泛型参数回复时就会遇到问题: final List reply3 = await channel.send(msg3); // 失败. final

    4.4K01

    重走Flutter状态管理之路—Riverpod最终篇

    理想情况下,参数应该是一个基础类型(bool/int/double/String),一个常数(Provider),或者一个重写==hashCode不可变对象。...现在,userProvider状态将在不再使用时自动被销毁。 注意通用参数是如何在autoDispose之后而不是之前传递--autoDispose不是一个命名构造函数。...,把过滤方法todo-list结合起来,暴露出过滤后todo-list。...通过这三篇文章,相信大家已经能熟练Riverpod进行使用了,相比package:Provider,Riverpod使用更加简单灵活,这也是我推荐它一个非常重要原因,在入门之后,大家可以根据文档作者提供示例来进行学习...,充分了解Riverpod在实战使用技巧。

    2.3K30

    写给flutter开发者vscode快捷键、插件设置

    搞定基础一切后,我们接下来就需要根据个人喜欢做一些个性化定制来提高我们工作效率。 本文将分享我在flutter日常开发中所使用「快捷键、插件以及相关设置」。...stanim: 插入一个 StatefulWidget 并且带有 AnimationController 这些能帮我们快速生成一些重复代码。...2.状态管理相关插件 大家可以根据自己使用状态管理,来搜索相关插件 像 flutter bloc Flutter Riverpod Snippets 这些也是我开发必备,让重复工作交给插件...针对flutter开发者设置 在vscode也有一些设置来提高效率。...(FlatButtonRaisedButton)。不用担心,因为不必全部手工修复。

    6.6K21

    Flutter 移动应用程序创建一个列表

    Flutter 是一个流行开源工具包,它可用于构建跨平台应用。在文章《用 Flutter 创建移动应用》,我已经向大家展示了如何在 Linux 安装 Flutter 并创建你第一个应用。...而这篇文章,我将向你展示如何在应用添加一个列表,点击每一个列表项可以打开一个新界面。...这是移动应用一种常见设计方法,你可能以前见过,下面有一个截图,能帮助你对它有一个更直观了解: Flutter 使用 Dart 语言。在下面的一些代码片段,你会看到以斜杠开头语句。...一个好做法是,把 main() 方法其他页面的代码分开放到不同文件。...经过上面的操作我们将 flutter/material.dart 包添加到了 main.dart 文件,这样我们就可以使用 Flutter 提供默认 material 主题微件。

    3.1K10
    领券