首页 > 其他分享 >flutter状态管理 provider使用

flutter状态管理 provider使用

时间:2024-07-04 18:53:40浏览次数:16  
标签:状态 const dart context provider inputText import flutter

provider是flutter官方推荐的状态管理插件,是基于InheritedWidget实现的。
下面我们来讲一个provider的使用方法。
1.在pubspec.yaml文件中添加 provider: ^6.1.2 开发文档:https://pub-web.flutter-io.cn/packages/provider 可以查看使用方法和最新版本号。
添加完成后,进行保存,VSCode会自动 flutter pub get 安装依赖,如果没有自动安装则手动执行flutter pub get

2..创建一个继承自ChangeNotifier的类 input_provider.dart
ChangeNotifier 是 Flutter SDK 中的一个简单的类。它用于向监听器发送通知。换言之,如果被定义为 ChangeNotifier,你可以订阅它的状态变化。(这和大家所熟悉的观察者模式相类似)。

import 'package:flutter/material.dart';

///监听内容变化
class InputProvider extends ChangeNotifier {
  ///等待改变的内容 可以是普通类型 也可以是 数组、字典、自定义model
  String _inputText = '';
  String get inputText => _inputText;
  set inputText(String value) {
    _inputText = value;
    notifyListeners();
  }
}

3.用MultiProvider包裹MyApp,让MyApp下的子孙节点具备Provider的能力 main.dart代码如下

import 'package:flutter/material.dart';
import 'one_page.dart';
import 'two_page.dart';
import 'package:provider/provider.dart';
import 'input_provider.dart';

void main() {
  runApp(
    // 使用MultiProvider包裹MyApp,使得MyApp下的子孙节点具备Provider的能力
    MultiProvider(
      providers: [
        ChangeNotifierProvider<InputProvider>(
            create: (context) => InputProvider()),
      ],
      child: const MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Demo',
        // 不显示debug
        debugShowCheckedModeBanner: false,
        theme: ThemeData(
          colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
          useMaterial3: true,
        ),
        routes: {
          '/one': (context) => const OnePage(),
          '/two': (context) => const TwoPage(),
        },
        home: const OnePage());
  }
}

4.新建 one_page.darttwo_page.dart 实现接收状态改变通知和改变状态方法

one_page.dart代码如下:

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

class OnePage extends StatefulWidget {
  const OnePage({super.key});
  @override
  State<OnePage> createState() => _OnePageState();
}

class _OnePageState extends State<OnePage> {
  late String _text;
  @override
  void initState() {
    _text = 'This is the first page';
    //当文本发生变化时,监听变化内容,并更新文本
    Provider.of<InputProvider>(context, listen: false).addListener(() {
      String text =
          Provider.of<InputProvider>(context, listen: false).inputText;
      setState(() {
        //刷新页面
        _text = text;
      });
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: const Text('One Page')),
        body: Center(
          child: Column(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                Text(_text),
                ElevatedButton(
                  onPressed: () {
                    //跳转到第二个页面
                    // Navigator.pushNamed(context, '/two');
                    Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => const TwoPage(),
                      ),
                    );
                  },
                  child: const Text('跳转第二个页面'),
                ),
              ]),
        ));
  }
}

two_page.dart代码如下:

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

class TwoPage extends StatefulWidget {
  const TwoPage({super.key});
  @override
  State<TwoPage> createState() => _TwoPageState();
}

class _TwoPageState extends State<TwoPage> {
  final TextEditingController _controller = TextEditingController();
  late String _text;
  @override
  void initState() {
    _text = 'This is the second page';
    super.initState();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Two Page')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            //使用Consumer获取InputProvider中的inputText
            Consumer(builder: (context, InputProvider provider, child) {
              return Text(
                  provider.inputText.isEmpty ? _text : provider.inputText);
            }),
            //使用Consumer获取InputProvider中的inputText
            Consumer(
                builder: (context, InputProvider provider, child) => Text(
                    provider.inputText.isEmpty ? _text : provider.inputText)),
            Container(
              padding: const EdgeInsets.only(left: 15, right: 15),
              child: TextField(
                controller: _controller,
                decoration: const InputDecoration(
                  border: OutlineInputBorder(),
                  labelText: '输入内容',
                ),
              ),
            ),
            ElevatedButton(
              onPressed: () {
                _changeText();
              },
              child: const Text('提交改变'),
            ),
          ],
        ),
      ),
    );
  }

  //给inputText赋值,触发监听事件
  _changeText() {
    Provider.of<InputProvider>(context, listen: false).inputText =
        _controller.text;
  }
}

标签:状态,const,dart,context,provider,inputText,import,flutter
From: https://www.cnblogs.com/huangczh/p/18284448

相关文章

  • 进程D 状态的产生及原因解释
    在Linux系统中,进程的D状态表示进程处于不可中断的睡眠状态(UninterruptibleSleep)。这种状态通常由进程等待某些资源或事件引起,这些资源或事件无法立即可用。以下是一些常见的导致进程进入D状态的原因:I/O操作:等待磁盘I/O完成:进程可能正在等待磁盘读取或写入操作......
  • 翔云发票查验接口状态码说明,哪种情况扣次数那种情况不扣次数呢
    翔云发票查验API,实时联网,可以实现发票信息真伪的快速核验,帮助企业财务摆脱繁琐的发票真伪查验工作。那么知道了发票查验接口的作用,对于开发者而言,接口返回的状态码又分别代表什么含义呢?下面就翔云发票查验接口产品状态码做出以下说明:状态码说明:status code message0 成功(......
  • flutter 插件开发
    先引用一段官方的介绍说明:https://docs.flutter.cn/packages-and-plugins/developing-packagesPackage包含以下几种类别:纯Dart库(Dartpackages)用Dart编写的传统package,比如path。其中一些可能包含Flutter的特定功能,因此依赖于Flutter框架,其使用范围仅限于Flu......
  • Vuex 核心揭秘:打造高效前端状态库
    引言Vue.js是一个流行的JavaScript框架,以其简洁的设计和易用的特性赢得了开发者的青睐。它允许开发者通过声明式的方式编写前端代码,从而提高开发效率。Vuex是Vue.js的官方状态管理库,它为Vue应用提供了一个中心化存储,使得所有组件都能够访问和更新共享状态。这对于大......
  • Flutter——最详细(Badge)使用教程
    背景主要常用于组件叠加上圆点提示;使用场景,消息数量提示,消息红点提示属性作用backgroundColor红点背景色smallSize设置红点大小isLabelVisible是否显示offset设置红点位置alignment设置红点位置child设置底部组件代码块classBadgePageextendsStatelessWidget{......
  • flutter项目正式打包上线
    正式打包修改应用版本以及升级打包 ......
  • vue项目子组件使用 dialog 弹框,如何实现父子组件弹框展示状态关联?
    vue项目,子组件使用el-dialog组件,想要实现在父组件可以控制子组件dialog的展示和隐藏,子组件自己可以控制dialog展示和隐藏,该如何实现?1.子组件(DialogComponent.vue)子组件接受一个来自父组件的prop,用来控制dialog的显示状态,并且当子组件内部需要改变dialog状态时,通过......
  • 【转载】SCI审稿过程中的几种状态
    原文地址:http://cjsphd.blog.163.com/blog/static/44718111201191175154300/审稿中涉及到的人:EIC-EditorinChief主编,此人很重要,有稿件最终决定权。ADM-(可能是)Administrator应该是协助主编日常工作的。AE-AssociatedEditor副编辑(就是文章发表后在首页第一栏下方的c......
  • flutter 打开设置页面
    if(status.isPermanentlyDenied){//如果用户已永久拒绝了定位权限,您可以引导用户到应用设置页面以手动启用权限//如果用户已永久拒绝了定位权限,您可以引导用户到应用设置页面以手动启用权限//constintent=AndroidIntent(//action:'and......
  • 通过MATLAB控制TI毫米波雷达的工作状态
    前言前一章博主介绍了MATLAB上位机软件“设计视图”的制作流程,这一章节博主将介绍如何基于这些组件结合MATLAB代码来发送CFG指令控制毫米波雷达的工作状态串口配置首先,在我们选择的端口号输入框和端口波特率设置框内是可以手动填入数值(字符)的,也可以在点击运行后再填写。......