• 状态管理的艺术:探索Flutter的Provider库


    状态管理的艺术:探索Flutter的Provider库

    前言

    上一篇文章中,我们详细介绍了 Flutter 应用中的状态管理,以及 StatefulWidgetsetState 的使用。

    本篇我们继续介绍另一个实现状态管理的方式:Provider

    Provider优缺点

    基础介绍:

    Provider 是一个轻量级的状态管理库,它使用 InheritedWidgetChangeNotifier 的概念来实现状态共享和更新。

    Provider 允许我们在应用的任何位置访问和修改状态,并支持跨组件的状态共享。

    优点:

    (1)简单易用:提供了直观的 API,使得状态共享和更新变得简单。

    (2)减少代码耦合:将状态管理逻辑与 UI 分离,提高了代码的可维护性和可重用性。

    (3)支持跨组件状态共享:可以在应用的任何位置访问和修改状态。

    缺点:

    (1)性能考虑:虽然 Provider 优化了性能,但在大规模应用中仍需注意状态更新的效率和必要性。

    (2)学习成本:对于初学者来说,需要一段时间来熟悉 Provider 的用法和原理。

    使用步骤

    1.添加 Provider 依赖

    (provider 可自行选择,我这里选择了 6.0.5 版本 )

    dependencies:
      flutter:
        sdk: flutter
      provider: ^6.0.5
    

    2.创建状态类

    创建一个类来持有你的应用状态。这个类可以是简单的 Dart 类,包含一些属性和方法。

    // 定义一个简单的状态类
    class CounterState with ChangeNotifier {
      int _count = 0;
    
      int get count => _count;
    
      void increment() {
        _count++;
        notifyListeners();
      }
    }
    

    3.使用 Provider 包裹你的应用

    在你的应用的根 widget 或者使用状态的部分 widget 的上面,使用 ChangeNotifierProvider 来包裹你的应用或 widget

    ChangeNotifierProvider 接受一个 create 参数,这个参数是一个返回你创建的状态类的实例的函数。

    import 'package:flutter/material.dart';
    import 'package:provider/provider.dart';
    
    void main() {
      runApp(
        // 使用Provider将状态包裹在顶层
        ChangeNotifierProvider(
          create: (context) => CounterState(),
          child: MyApp(),
        ),
      );
    }
    

    4.在 widget 中使用状态

    在你的 widget 中,使用 Consumer widget 或者 Provider.of(context) 来访问和监听状态的变化。

    当状态变化时,Consumer 会重新构建其子 widget

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(title: Text('Provider Example')),
            body: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  // 使用Consumer来访问状态
                  Consumer<CounterState>(
                    builder: (context, counter, child) => Text(
                      '${counter.count}',
                      style: TextStyle(fontSize: 24),
                    ),
                  ),
                  RaisedButton(
                    onPressed: () {
                      // 使用Provider.of来访问状态并调用方法
                      context.read<CounterState>().increment();
                    },
                    child: Text('Increment'),
                  ),
                ],
              ),
            ),
          ),
        );
      }
    }
    
    

    5.更新状态

    在你的状态类中,当你需要更新状态时,直接修改状态类的属性,并确保你的状态类继承自 ChangeNotifier

    在修改属性后,调用 notifyListeners() 方法来通知所有监听这个状态的 widget 进行更新。

    class CounterState with ChangeNotifier {
      int _count = 0;
    
      int get count => _count;
    
      void increment() {
        _count++;
        notifyListeners();  // 通知所有监听这个状态的widget进行更新
      }
    }
    

    完整示例

    在下面这个例子中,我们定义了一个 CounterState 类,它包含一个计数器和 increment 方法来增加计数。

    我们使用 ChangeNotifierProvider 来将状态包裹在应用的顶层,并在需要的地方使用 ConsumerProvider.of 来访问和修改状态。

    代码如下(示例):

    import 'package:flutter/material.dart';
    import 'package:provider/provider.dart';
    
    // 定义一个简单的状态类
    class CounterState with ChangeNotifier {
      int _count = 0;
    
      int get count => _count;
    
      void increment() {
        _count++;
        notifyListeners();
      }
    }
    
    void main() {
      runApp(
        // 使用Provider将状态包裹在顶层
        ChangeNotifierProvider(
          create: (context) => CounterState(),
          child: MyApp(),
        ),
      );
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(title: Text('Provider Example')),
            body: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  // 使用Consumer来访问状态
                  Consumer<CounterState>(
                    builder: (context, counter, child) => Text(
                      '${counter.count}',
                      style: TextStyle(fontSize: 24),
                    ),
                  ),
                  ElevatedButton(
                      onPressed: () {
                        // 使用Provider.of来访问状态并调用方法
                        context.read<CounterState>().increment();
                      },
                      child: Text('Increment')
                 ),
               ],
              ),
            ),
          ),
        );
      }
    }
    

    结果如下:

    总结

    Flutter 中,Provider 是一个非常流行的状态管理库,它允许你将状态(数据)在 widget 树中传递,而无需手动在每个 widget 层级上传递。

    使用 Provider,你可以在应用的任何地方访问和更新状态,这使得状态管理变得更加简单和高效。

    – 欢迎点赞、关注、转发、收藏【我码玄黄】,gonghao同名

  • 相关阅读:
    SpringCloud: RestTemplate 带header发送post请求
    《论文阅读》Commonsense Knowledge Aware Conversation Generation with Graph Attention
    【JVM笔记】直接内存
    FP16\FP32\INT8\混合精度的含义
    docker存储卷
    前端和后端分别做什么?
    23 Python的shutil模块
    【视觉SLAM十四讲学习笔记】第二讲——初识SLAM
    如何在Centos8中添加附加的IP
    bug修复 修复修复修复
  • 原文地址:https://blog.csdn.net/qq_30333063/article/details/140395570