Flutter Provide插件

在使用Flutter时,Provider 是一个非常强大的状态管理工具,可以帮助你在多个Widget和页面之间共享和实时修改数据。下面是一个简单的示例,展示如何使用 Provider 实现多Widget、多页面之间的数据实时修改和共享。

1. 添加依赖

首先,确保在 pubspec.yaml 文件中添加 provider 依赖:

yaml 复制代码
dependencies:
  flutter:
    sdk: flutter
  provider: ^6.0.0

然后运行 flutter pub get 来安装依赖。

2. 创建数据模型

我们需要创建一个数据模型类,并使用 ChangeNotifier 来通知监听者数据的变化。

scala 复制代码
import 'package:flutter/material.dart';
 //必须继承ChangeNotifier
class CounterModel with ChangeNotifier {
  int _count = 0;

  int get count => _count;

  void increment() {
    _count++;
    notifyListeners(); //写死
  }

  void decrement() {
    _count--;
    notifyListeners();
  }
}

3. 在顶层提供数据模型

在应用的顶层使用 ChangeNotifierProvider 来提供 CounterModel 实例。

scala 复制代码
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'counter_model.dart';

void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) => CounterModel(),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Provider Example',
      home: HomePage(),
    );
  }
}

4. 在多个Widget中使用数据

现在你可以在多个Widget中使用 Provider 来访问和修改数据。

HomePage

less 复制代码
class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
  
  //还有一种获取方式
  final counterModel = Provider.of<CounterModel>(context);
  print(counterModel.count)
  
  
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Count:',
              style: Theme.of(context).textTheme.headline4,  //另一种获取
            ),
            Consumer<CounterModel>(
              builder: (context, counter, child) {
                return Text(
                  '${counter.count}',
                  style: Theme.of(context).textTheme.headline4,
                );
              },
            ),
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => SecondPage()),
                );
              },
              child: Text('Go to Second Page'),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Provider.of<CounterModel>(context, listen: false).increment(); //修改数据
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

SecondPage

less 复制代码
class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second Page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Count:',
              style: Theme.of(context).textTheme.headline4,
            ),
            Consumer<CounterModel>(
              builder: (context, counter, child) {
                return Text(
                  '${counter.count}',
                  style: Theme.of(context).textTheme.headline4,
                );
              },
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Provider.of<CounterModel>(context, listen: false).decrement();
        },
        tooltip: 'Decrement',
        child: Icon(Icons.remove),
      ),
    );
  }
}

5. 运行应用

现在你可以运行应用,并在两个页面之间切换,同时实时查看和修改 count 的值。

总结

通过 Provider,你可以轻松地在多个Widget和页面之间共享和修改数据。ChangeNotifierProviderConsumerProvider 包中常用的工具,它们帮助你管理状态并确保UI在数据变化时自动更新。

相关推荐
恋猫de小郭2 小时前
Flutter Riverpod 3.0 发布,大规模重构下的全新状态管理框架
android·前端·flutter
RaidenLiu4 小时前
Riverpod 3:重建控制的实践与性能优化指南
前端·flutter
蒋星熠20 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
卢叁1 天前
Flutter之自定义TabIndicator
前端·flutter
萧雾宇1 天前
Android Compose打造仿现实逼真的烟花特效
android·flutter·kotlin
拜无忧1 天前
【教程】flutter常用知识点总结-针对小白
android·flutter·android studio
拜无忧1 天前
【教程】Flutter 高性能项目架构创建指南:从入门到高性能架构
android·flutter·android studio
醉过才知酒浓1 天前
flutter 拦截返回按钮的方法(WillPopScope or PopScope)
flutter
傅里叶1 天前
sudo启动Flutter程序AMD初始化失败
linux·flutter
苦逼的搬砖工1 天前
Flutter UI Components:闲来无事,设计整理了这几年来使用的UI组件库
前端·flutter