Flutter实战项目-第四篇 页面路由、provider状态管理

2023-11-03

概要

  • 页面路由配置
  • provider

一、路由配置

创建router.dart用于管理所有的路由,然后再main.dart MaterialApp中注册路由。

router.dart中第一个routeName="/",即是默认打开的页面

import './view/login/login.dart';
class JDRouter {
  static final routes = {
    Login.routeName: (context) => const Login()
  };
}

main.dart

import 'package:flutter/material.dart';
import 'router.dart';
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      routes: JDRouter.routes,
    );
  }
}

二、状态管理

        provider官方推荐的状态管理,类似Vuex和reduce之类。其可以全局注册,也可以局部注册,用户可根据自己的实际需求选择注册方式。因为状态的改变会触发build,所以用户使用是应当避免反复的build消耗。provider本身支持监听多个,但是也是有数量限制,具体可以查阅官方资料。当前只是介绍了最常用的情况。

        2.1全局注册

        创建文件global.notifier.dart

import 'package:flutter/material.dart';

class GlobalNotifier with ChangeNotifier{
  //底部导航栏按钮状态
  int menuIndex =0;
  void increment(int param){
    menuIndex = param;
    notifyListeners();
  }
}

在main.dart中注册

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'router.dart';
import 'store/global.notifier.dart';
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<GlobalNotifier>(create: (_)=>GlobalNotifier()),
      ],
      child:MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        routes: JDRouter.routes,
      )
    );
  }
}

页面中使用监听及更新值

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

import '../../store/global.notifier.dart';
class Login extends StatefulWidget {
  /// 登录页面
  const Login({Key? key}) : super(key: key);
  static const routeName = '/';
  @override
  State<Login> createState() => _LoginState();
}

class _LoginState extends State<Login> {
  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      padding: EdgeInsets.all(20),
      child: Consumer<GlobalNotifier>(
        builder: (_, globalNotifier,child){
          return Column(
            children:[
              Text('${globalNotifier.menuIndex}'),
              TextButton(
                onPressed: (){
                  globalNotifier.increment(10);
                },
                child: Text("更新值")
              )
            ]
          );
        }
      )
    );
  }
}

代码中获取值/设置

Provider.of<GlobalNotifier>(context).menuIndex

Provider.of<GlobalNotifier>(context).menuIndex

///需在initsate之后使用
Provider.of<GlobalNotifier>(context,listen: false).increment(10);

多个监听时

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

import '../../store/global.notifier.dart';
import '../../store/login/login.notifier.dart';
class Login extends StatefulWidget {
  /// 登录页面
  const Login({Key? key}) : super(key: key);
  static const routeName = '/';
  @override
  State<Login> createState() => _LoginState();
}

class _LoginState extends State<Login> {
  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      padding: EdgeInsets.all(20),
      child: Consumer2<GlobalNotifier,LoginNotifier>(
        builder: (_, globalNotifier,loginNotifier,child){
          return Column(
            children:[
              Text('${globalNotifier.menuIndex}${loginNotifier.name}'),
              TextButton(
                onPressed: (){
                  globalNotifier.increment(10);
                  loginNotifier.increment('JavonHuang');
                },
                child: Text("更新值")
              )
            ]
          );
        }
      )
    );
  }
}

2.2局部注册

        通过ChangeNotifierProvider可以使实现局部注册

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

import '../../store/global.notifier.dart';
import '../../store/login/login.notifier.dart';
class Login extends StatefulWidget {
  /// 登录页面
  const Login({Key? key}) : super(key: key);
  static const routeName = '/';
  @override
  State<Login> createState() => _LoginState();
}

class _LoginState extends State<Login> {
  @override
  Widget build(BuildContext context) {
    return  ChangeNotifierProvider<LoginNotifier>(
      create: (_) => LoginNotifier(),
      child:Container(
      color: Colors.white,
      padding: EdgeInsets.all(20),
      child: Consumer<LoginNotifier>(
        builder: (_,loginNotifier,child){
          return Column(
            children:[
              Text('${loginNotifier.name}'),
              TextButton(
                onPressed: (){
                  // globalNotifier.increment(10);
                  loginNotifier.increment('JavonHuang');
                },
                child: Text("更新值")
              )
            ]
          );
        }
      )
    ) ,
    );
  }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter实战项目-第四篇 页面路由、provider状态管理 的相关文章

随机推荐

  • UITabBarItem

    UITabBarController UITabBar UIBarItem UITabBarItem UITabBarItem就是UITabBar上显示的小按钮 我们也可以定制系统UITabBarItem按钮 只需通过UITabBarIte
  • C/C++的64位整型 zz

    为了和DSP兼容 TSint64和TUint64设置成TSint40和TUint40一样的数 结果VC中还是认为是32位的 显然不合适 typedef signed long int TSint64 typedef unsigned lon
  • 初始化 Repo错误 错误信息:fatal: error [Errno 111] Connection refused

    错误信息 fatal error Errno 111 Connection refused 解决方法 修改home 目录下的 bashrc文件 gedit bashrc 在文件的末尾添加如下命令 export PATH bin PATH e
  • QT5.6静态编译添加ODBC数据库

    qt5 6已经编译好 现在添加ODBC数据库的支持 1 进入qt everywhere opensource src 5 6 3 qtbase src plugins sqldrivers odbc目录 运行qmake exe 然后再运行n
  • C语言学生管理系统课程设计

    include
  • cookie和session之间的关系

    当登录接口依赖token的 可以先登录后 token存到一个yaml或者json或者ini的配置文件里面 后面所有的请求去拿这个数据就可以全局使用 如果是cookies的参数 可以用session自动关联 详情如下 一 cookie与ses
  • 超全!深度学习在计算机视觉领域的应用一览

    计算机视觉领域正在从统计方法转向深度学习神经网络方法 计算机视觉中仍有许多具有挑战性的问题需要解决 然而 深度学习方法正在针对某些特定问题取得最新成果 在最基本的问题上 最有趣的不仅仅是深度学习模型的表现 事实上 单个模型可以从图像中学习意
  • MySQL查询数据库中所有表名及注释等信息

    1 查询所有表名 select table name from information schema tables where table schema 当前数据库 2 查看所有字段和字段注释 SELECT COLUMN NAME 字段 c
  • torch.Size理解

    torch Size括号中有几个数字就是几维 第一层 最外层 中括号里面包含了两个中括号 以逗号进行分割 这就是 2 3 4 中的2 第二层中括号里面包含了三个中括号 以逗号进行分割 这就是 2 3 4 中的3 第三层中括号里面包含了四个数
  • Python中MD5加密

    MD5是什么 下面的概念是百度百科的 Message Digest Algorithm MD5 中文名为消息摘要算法第五版 为计算机安全领域广泛使用的一种散列函数 用以提供消息的完整性保护 该算法的文件号为RFC 1321 R Rivest
  • ev3编程 python_乐高 EV3 高级编程 - 第四课:Python 模块

    译者按 使用 ev3dev Linux 系统并用 Python 编程的人数比例很低 好像这一课这样写 Python 编程的就更少了 你会发现程序的重用率会大大的提高 EV3 Lesson 4 Python Modules EV3 第 4 课
  • win10 电脑 .Net framework3.5 组件无法安装0x800f801f

    最近在win10上安装了MotorControl Workbench 5 4 0软件需要用到 Net framework3 5 但是安装Net framework3 5老是出错 无论是下载离线安装包安装 还是通过 控制面板 中 程序 的 启
  • 【SSM框架系列】Spring IoC(控制反转) & DI(依赖注入)

    Spring是什么 Spring是分层的 Java SE EE应用 full stack 轻量级开源框架 以 IoC Inverse Of Control 反转控制 和 AOP Aspect Oriented Programming 面向切
  • 指数增强(股票)——Python量化

    指数增强策略 目录 指数增强策略 1 策略原理 2 策略步骤 3 策略代码 4 回测结果和稳健性分析 1 策略原理 说到指数增强 就不得不说指数 在进行股票投资时 有一种分类方式是将投资分为主动型投资和被动型投资 被动型投资是指完全复制指数
  • python对dataframe中series的json格式解析

    方法1 如果df里只有一列json格式 可以保存为txt 然后再删掉列名 在进行处理 import pandas as pd result with open r C Users Administrator Desktop json处理 t
  • 【你不知道的JavaScript】(05)作用域+闭包+编译执行过程

    本文章仅针对我自己在看书过程中对一些不太清楚的知识点进行查漏补缺 你不知道的JavaScript 上卷 第一部分作用域和闭包 编译与执行 传统编译语言的编译过程 词法分析 语法分析 代码生成 而JavaScript语言则要更复杂 JS引擎不
  • mac 访问钥匙串中创建系统证书失败 未知错误的解决方案

    If you cannot store the certificate in the System keychain create it in the login keychain then exported it You can then
  • 慢日志分析工具mysqldumpslow

    慢查询分析工具mysqldumpslow mysqldumpslow OPTS LOGS 后跟参数以及log文件的绝对地址 s 按照那种方式排序 c 访问计数 l 锁定时间 r 返回记录 al 平均锁定时间 ar 平均访问记录数 at 平均
  • c#和js的交互(转)

    如何在 C 中访问 JavaScript 函数 答案如下 c 代码中执行 javaScript 函数 方法一 1 Page RegisterStartupScript ggg 方法二 使用 Literal 类 然后 private void
  • Flutter实战项目-第四篇 页面路由、provider状态管理

    概要 页面路由配置 provider 一 路由配置 创建router dart用于管理所有的路由 然后再main dart MaterialApp中注册路由 router dart中第一个routeName 即是默认打开的页面 import