Provider状态管理练习

一、添加依赖

provider: 6.0.5

在这里插入图片描述

二、创建CountModel.dart

注意:要继承ChangeNotifier

import 'package:flutter/cupertino.dart';
class CountModel with ChangeNotifier{
  int _count;
  CountModel(this._count);

  void add(){//数值增加方法
    _count++;
    notifyListeners();//notifyListeners()用于通知全部订阅内容提供的组件
  }
  get count=>_count;//get方法用于获得_count的值,订阅者通过${Provider.of<CountModel>(context).count}获得_count的值,就必须定义get方法
}

三、创建两个页面并订阅CountModel状态管理类

页面一:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'TestView.dart';
import 'model/CountModel.dart';

void main() {
  // runApp(const MyApp());//初次创建项目的内容
  runApp(
    ChangeNotifierProvider(//应用CountModel状态管理类
      create: (context)=> CountModel(0),
      child: MyApp(),
    )
  );
  /*
  runApp(
    MultiProvider(//想要应用多个状态管理类,就要使用MultiProvider
      providers : [// 状态管理类的集合,集合元素ChangeNotifierProvider(里面是巴拉巴拉小魔仙)
        ChangeNotifierProvider(
          create: (context)=> CountProvider(),
        ),
        ChangeNotifierProvider(
          create: (context)=> MvvmDemoViewmodel(),
        ),
      ],
      child: MyApp(),
    )
  */
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;


  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        actions: [
          IconButton(
            icon: Icon(Icons.accessibility_rounded),
            onPressed: () {//创建一个跳转界面,跳转到新的路由,本跳转不传任何值
              Navigator.push(context, MaterialPageRoute(builder: (context) {
                return TestView();
              }));
            },
          ),
        ],
      ),

      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
                  Text(
                          //以下代码Provider.of<model类名>(context).属性值
                          //请注意,属性值在model类中必须有get方法
                          "${Provider.of<CountModel>(context).count}",
                          style: Theme.of(context).textTheme.headline4,//字体样式
                        ),
          ],
        ),
      ),

      floatingActionButton: FloatingActionButton(//悬浮按钮
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );

  }
  void _incrementCounter() {//悬浮按钮点击事件
    //context.read<model类名>().model中的方法;
    context.read<CountModel>().add();
  }
}

页面二:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'model/CountModel.dart';

class TestView extends StatefulWidget {
  const TestView({Key? key}) : super(key: key);

  
  State<TestView> createState() => _TestViewState();
}

class _TestViewState extends State<TestView> {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('TestViewTite'),
      ),
      body: Column(
        children: [
          TextButton(
            child: Text('按钮',style: TextStyle(fontSize: 35),),
            onPressed: () {
              context.read<CountModel>().add();//调用CountModel中的add()方法,增加全局变量_count的值
            }
          )
          ,
          Text("${Provider.of<CountModel>(context).count}",
                style: TextStyle(fontSize: 30),
              )
        ],
      ),
    );
  }
}

四、效果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值