• Flutter 状态管理新境界:多Provider并行驱动UI


    前言

    在上一篇文章中,我们讨论了如何使用 ProviderFlutter 中进行状态管理

    本篇文章我们来讨论如何使用多个 Provider

    Flutter 中,使用 Provider 管理多个不同的状态时,你可以为每个状态创建一个单独的 ChangeNotifierProvider,并在需要的地方使用 Provider.of(context)Consumer来访问这些状态。

    接下来让我们正式开始使用:

    为每个状态创建类

    为每个需要管理的状态创建一个类,并确保这些类继承自 ChangeNotifier

    class Counter with ChangeNotifier {
      int _count = 0;
    
      int get count => _count;
    
      void increment() {
        _count++;
        notifyListeners();
      }
    }
    
    class ThemeSwitcher with ChangeNotifier {
      bool _isDarkTheme = false;
    
      bool get isDarkTheme => _isDarkTheme;
    
      void toggleTheme() {
        _isDarkTheme = !_isDarkTheme;
        notifyListeners();
      }
    }
    

    在应用的根或需要的地方提供状态

    使用 ChangeNotifierProvider 来包裹你的应用或特定的 widget,并为每个状态提供一个 create 函数来创建其对应的实例。

    import 'package:flutter/material.dart';
    import 'package:provider/provider.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      
      Widget build(BuildContext context) {
        return MultiProvider(
          providers: [
            ChangeNotifierProvider(create: (context) => Counter()),
            ChangeNotifierProvider(create: (context) => ThemeSwitcher()),
          ],
          child: MaterialApp(
            home: MyHomePage(),
          ),
        );
      }
    }
    

    在 widget 中访问状态

    使用 Provider.of(context)Consumer 在需要的地方访问状态。

    class MyHomePage extends StatelessWidget {
      
      Widget build(BuildContext context) {
        final counter = Provider.of<Counter>(context);
        final themeSwitcher = Provider.of<ThemeSwitcher>(context);
    
        return Scaffold(
          appBar: AppBar(
            title: Text('Multiple Providers Example'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '${counter.count}',
                  style: Theme.of(context).textTheme.headline4,
                ),
                Switch(
                  value: themeSwitcher.isDarkTheme,
                  onChanged: (value) {
                    themeSwitcher.toggleTheme();
                  },
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () {
              counter.increment();
            },
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    }
    

    更新状态

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

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

    完整示例

    下面是一个例子,展示了如何使用 Provider 来管理两个不同的状态:

    代码如下(示例):

    import 'package:flutter/material.dart';
    import 'package:provider/provider.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      
      Widget build(BuildContext context) {
        return MultiProvider(
          providers: [
            ChangeNotifierProvider(create: (context) => Counter()),
            ChangeNotifierProvider(create: (context) => ThemeSwitcher()),
          ],
          child: MaterialApp(
            home: MyHomePage(),
          ),
        );
      }
    }
    
    class Counter with ChangeNotifier {
      int _count = 0;
    
      int get count => _count;
    
      void increment() {
        _count++;
        notifyListeners();
      }
    }
    
    class ThemeSwitcher with ChangeNotifier {
      bool _isDarkTheme = false;
    
      bool get isDarkTheme => _isDarkTheme;
    
      void toggleTheme() {
        _isDarkTheme = !_isDarkTheme;
        notifyListeners();
      }
    }
    
    class MyHomePage extends StatelessWidget {
      
      Widget build(BuildContext context) {
        final counter = Provider.of<Counter>(context);
        final themeSwitcher = Provider.of<ThemeSwitcher>(context);
    
        return Scaffold(
          appBar: AppBar(
            title: Text('Multiple Providers Example'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '${counter.count}',
                  style: Theme.of(context).textTheme.headline4,
                ),
                Switch(
                  value: themeSwitcher.isDarkTheme,
                  onChanged: (value) {
                    themeSwitcher.toggleTheme();
                  },
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () {
              counter.increment();
            },
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    }
    

    运行结果如下

    总结

    本文主要介绍了在 Flutter 中如何使用多个 Provider 进行状态管理。

    类似的状态管理还有 BlocGetX 的使用,后续会继续分享它们的使用方式,欢迎关注。

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

  • 相关阅读:
    yolo数据集剪裁:切割目标框并将该框内的其他目标一并提取并转为可用数据集
    传TikTok或将与甲骨文达成数据存储协议;苹果1.8米连接线卖949元;云原生日志系统Loggie正式开源|极客头条
    Elasticsearch语法之Term query不区分大小写
    Java8 新特性之Stream(一)-- 认识Stream
    「C++」深度分析C++中i++与++i的区别
    os.path.join函数用法
    Django模版层
    python自动解析301、302重定向链接
    大家都说Java有三种创建线程的方式!并发编程中的惊天骗局!
    AI绘画想生成好看的图,这些技巧不得不掌握
  • 原文地址:https://blog.csdn.net/qq_30333063/article/details/140431506