Flutter状态管理Provider示例解析

作者:顾安 时间:2023-02-10 07:09:17 

什么是状态管理

状态管理是一个十分广泛的概念,因为状态无处不在。从广义角度讲状态管理就是页面跟代码、跟服务器进行数据同步。例如:你在某购物应用内,添加了一件商品,你需要在购物车页面进行展示。这就是一种状态。相反的,你在商品页面点击了添加到购物车,却在购物车页面没有发现或者过段时间它才展示了,这就是状态管理没有做好。这就是我所理解的状态管理。

官方给出的解释:状态管理就是当某个状态发生改变的时候,告知使用该状态的状态监听者,让状态所监听的属性随之改变,从而达到联动效果。

Flutter状态管理Provider示例解析

常见的状态管理框架有哪些

Provider

Provider是官方文档的例子用的方法,Google 比较推荐的用法,也是今天的主角。Provider的实现在内部还是利用了InheritedWidget,它就是用于提供数据,可以很方便的管理状态。

Redux

Redux是一种单向数据流架构,可以轻松开发,维护和测试应用程序,也是google推荐的状态管理方式。所有的状态都存储在Store里,View拿到Store的状态数据会映射成视图渲染。Redux不直接让view操作数据,通过dispatch一个action通知Reducer,状态变更(类似于vue中的vuex)。

GetX

GetX包含很多功能,各种弹出widget、路由管理、国际化、Utils、状态管理等所以我觉得它不单单是一个状态管理器,更像是一个框架(类似于vue cli)。关于GetX的争论也很多,今天我们不讨论。我的建议是,对于像我一样的小白,还是从Provider开始,打好基础再说。

Provider 使用

添加依赖

  • 使用命令行方式

flutter pub add provider
  • pubspec.yaml 添加这样一行(并运行隐式flutter pub get):

dependencies:
provider: ^6.0.4

导入应用

import 'package:provider/provider.dart';

定义需要共享的数据

class ProviderData with ChangeNotifier {
 int count = 0;
 void increment() {
   count++;
   notifyListeners();
 }
}

在应用程序入口初始化

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import './provider/index.dart';
import './page/HomePage.dart';
void main() {
 runApp(MyApp());
}
class MyApp extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
   return ChangeNotifierProvider(
     create: (_) => CountNotifier(),
     child: MaterialApp(
       debugShowCheckedModeBanner: false,
        home: const Scaffold(
           body: HomePage(),
         ),
     ),
   );
 }
}

使用共享数据

import 'package:flutter/material.dart';
import 'package:flutter_provider_example/provider_count_example/count_notifier.dart';
import './provider/provider.dart';
class ProviderExample extends StatefulWidget {
 const ProviderExample({Key? key}) : super(key: key);
 @override
 State<ProviderExample> createState() => _ProviderExampleState();
}
class _ProviderExampleState extends State<ProviderExample> {
 final counter = Provider.of<ProviderData>(context);
 @override
 Widget build(BuildContext context) {
   return Scaffold(
     appBar: AppBar(
       title: const Text("InheritedWidget"),
     ),
     floatingActionButton: FloatingActionButton(
       onPressed: (){
         counter.increment();
       },
       child: const Icon(Icons.add),
     ),
     body: Center(
       child: Text(counter.count.toString(),
         style: const TextStyle(
             color: Colors.red,
             fontSize: 50
         ),
       ),
     ),
   );
 }
}

状态管理的好处

  • 能有效分离 UI 层和数据处理层

  • 帮助前端应用结构化数据

  • 有效控制状态的变化

  • 处理同步与异步

  • 实现一些日志打印,热加,同构应用等功能

  • ...

结束语

关于flutter状态管理的学习到这里就结束了,更多关于Flutter状态管理Provider的资料请关注脚本之家其它相关文章!

来源:https://juejin.cn/post/7169045609909846046

标签:Flutter,状态管理,Provider
0
投稿

猜你喜欢

  • 完美解决IDEA Ctrl+Shift+f快捷键突然无效的问题

    2021-11-23 06:36:19
  • Kotlin中协程的创建过程详析

    2023-11-27 07:45:16
  • C#中使用闭包与意想不到的坑详解

    2022-08-15 00:13:58
  • Java 事务注解@Transactional回滚(try catch、嵌套)问题

    2021-05-29 17:54:43
  • Spring Cloud Hystrix 服务降级限流策略详解

    2022-05-02 15:20:27
  • mybatis项目CRUD步骤实例详解

    2023-04-21 13:12:00
  • Java游戏俄罗斯方块的实现实例

    2022-11-26 12:35:49
  • Android布局技巧之使用ViewStub

    2023-03-22 06:34:10
  • 详解Android 中的文件存储

    2023-12-21 17:44:44
  • C#反射应用实例

    2023-11-03 14:47:46
  • Android实现图片的高斯模糊(两种方式)

    2023-01-24 05:42:48
  • c#在excel中添加超链接示例分享

    2023-06-03 14:10:45
  • 带你入门Java的泛型

    2023-06-08 02:48:24
  • android音频编辑之音频裁剪的示例代码

    2021-08-13 00:30:20
  • 一篇文章带你深入了解Java线程池

    2021-11-22 21:59:42
  • SpringBoot深入探究@Conditional条件装配的使用

    2021-08-18 00:06:53
  • Spring RestTemplate的使用与踩坑

    2022-01-12 21:43:14
  • MyEclipse设置Console输出到文件的实现方法

    2022-01-14 10:37:03
  • java发送kafka事务消息的实现方法

    2022-05-17 01:18:35
  • java web实现简单留言板功能

    2021-10-29 17:22:31
  • asp之家 软件编程 m.aspxhome.com