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在数据变化时自动更新。

相关推荐
kirk_wang21 分钟前
Flutter艺术探索-Flutter性能优化基础:const与const构造函数
flutter·移动开发·flutter教程·移动开发教程
AiFlutter1 小时前
Flutter-Android不能通过apply script方法应用Gradle插件
android·flutter
恋猫de小郭1 小时前
Flutter 又迎大坑修改?iOS 26 键盘变化可能带来大量底层改动
android·flutter·ios·kotlin
lbb 小魔仙1 小时前
【Harmonyos】开源鸿蒙跨平台训练营DAY1:Windows上搭建Flutte跨平台开发环境
windows·flutter·harmonyos·鸿蒙·开源鸿蒙·鸿蒙开平台应用
猛扇赵四那边好嘴.2 小时前
Flutter 框架跨平台鸿蒙开发 - 数学练习应用开发教程
flutter·华为·harmonyos
[H*]2 小时前
Flutter框架跨平台鸿蒙开发——Image Providers详解
flutter·华为·harmonyos
鸣弦artha2 小时前
Flutter框架跨平台鸿蒙开发——EventChannel事件通道
flutter·华为·harmonyos
kirk_wang2 小时前
Flutter艺术探索-Flutter国际化:多语言支持实现
flutter·移动开发·flutter教程·移动开发教程
南村群童欺我老无力.2 小时前
Flutter 框架跨平台鸿蒙开发 - 打字练习应用开发教程
flutter·华为·harmonyos
猛扇赵四那边好嘴.2 小时前
Flutter 框架跨平台鸿蒙开发 - 录音工具应用开发教程
flutter·华为·harmonyos