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

相关推荐
0wioiw07 小时前
Flutter基础(前端教程③-跳转)
前端·flutter
Lefan9 小时前
一文了解什么是Dart
前端·flutter·dart
0wioiw010 小时前
Flutter基础(前端教程④-组件拼接)
前端·flutter
木叶丸11 小时前
Flutter 生命周期完全指南
android·flutter·ios
用户74279877375911 小时前
[flutter翻书效果] 用flutter实现一个书籍翻页效果
flutter
技术蔡蔡18 小时前
Flutter和Firebae简单的聊天应用
flutter·全栈·firebase
小蜜蜂嗡嗡1 天前
flutter封装vlcplayer的控制器
前端·javascript·flutter
你听得到112 天前
从需求到封装:手把手带你打造一个高复用、可定制的Flutter日期选择器
前端·flutter
哲科软件2 天前
跨平台开发的抉择:Flutter vs 原生安卓(Kotlin)的优劣对比与选型建议
android·flutter·kotlin
天涯海风2 天前
Kuikly 与 Flutter 的全面对比分析,结合技术架构、性能、开发体验等核心维度
flutter·kuikly