iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Flutter 局部刷新
  • 173
分享到

Flutter 局部刷新

flutter 2023-09-05 06:09:20 173人浏览 薄情痞子
摘要

Flutter的局部刷新的几种方式 第一种 :使用 GlobalKey 父组件中声明 GlobalKey texTKEy = GlobalKey(); textKey.currentState.局部刷新的方法(); 第二种 使用:State

Flutter的局部刷新的几种方式

第一种 :使用 GlobalKey

父组件中声明

GlobalKey<_局部刷新对象类型State> texTKEy = GlobalKey();

textKey.currentState.局部刷新的方法();

第二种

使用:StatefulBuilder

第三种

使用 StreamBuilder + StreamController  FutureBuilder & StreamBuilder

第三种:provider  (也是异步通信)

ChangeNotifier  + ChangeNotifierProvider 

第四种   (也是异步通信) :Flutter ValueNotifier 异步通信、ValueListenableBuilder - 知乎

ValueNotifier + ValueListenableBuilder
 

第一种:使用 GlobalKey

globalkey唯一定义了某个element,它使你能够访问与element相关联的其他对象,例如buildContext、state等。
使用场景:可以通过key.currentState拿到它的状态对象,然后就可以调用其中的onPressed方法。

  //请求刷新  setState((){      });    #State  @override  Widget build(BuildContext context) {    //构建新的Widget    return new Text(_text);  } 

那么,如果 我们能将 build方法中的 return new Text(_text) 暴漏出去,我们就可以实现通用的 局部刷新 Widget。

实现方案

  1. 接口回调,将return new Text(_text);暴露出去:

用typedef function实现

 //定义函数别名 typedef BuildWidget = Widget Function();

将函数别名 BuildWidget 作为参数,传递到State.build方法即可

完整代码

 import 'package:flutter/material.dart'; //封装 通用局部刷新工具类//定义函数别名typedef BuildWidget = Widget Function(); class PartRefreshWidget extends StatefulWidget {   PartRefreshWidget(Key key, this._child): super(key: key);  BuildWidget _child;   @override  State createState() {    return PartRefreshWidgetState(_child);  } } class PartRefreshWidgetState extends State {   BuildWidget child;   PartRefreshWidgetState(this.child);   @override  Widget build(BuildContext context) {    return child.call();  }   void update() {    print('update');    setState(() {     });  }  }

使用:

import 'package:flutter/material.dart'; import 'PartRefreshWidget.dart'; class GlobalKeyDemo extends StatefulWidget {  @override  _GlobalKeyDemoState createState() => _GlobalKeyDemoState();} class _GlobalKeyDemoState extends State {  int _count = 0;   //使用1 创建GlobalKey  GlobalKey globalKey = new GlobalKey();   @override  Widget build(BuildContext context) {    print('----------------build');     return Scaffold(        appBar: AppBar(          title: Text("inheritedWidget"),        ),        body: Center(          child: Column(            mainAxisAlignment: MainAxisAlignment.center,            children: [              //使用2 创建通用局部刷新widget              PartRefreshWidget(globalKey, () {                ///创建需要局部刷新的widget                return Text(                  '变化的:$_count',                  style: TextStyle(color: Colors.green),                );              }),              Text('不变的: $_count'),              RaisedButton(                onPressed: () {                  //点击                  _count++;                  //使用3调用刷新方法                  globalKey.currentState.update();                },              ),            ],          ),        )    );  }}

转载:https://blog.csdn.net/jdsjlzx/article/details/123560075

第二种:使用:StatefulBuilder

使用情景:

多选和单选

单选的时候,选中一个就可以直接把结果返回,因此本身底部弹窗无需状态管理。但到多选的时候,需要知道当前选中的选项,有选项被点击的时候需要存储下来,当再次被点击的时候要清空这个选项,同时界面还需要同步更新,因此就涉及到状态管理了。

实现方式 内部使用。

在Flutter 中提供了一个 StatefulBuilder的类,提供了一个 builder方法构建有状态组件,并且提供了状态更新方法,因此在里面完成状态管理。

在这个 builder方法中,setState其实就是对应状态组件的setState对应的方法,这个 state 就是用于控制 StatefulBuilder生成的组件的状态的。这种方式有点类似于 React的 useState的钩子函数用法

使用的核心代码:

class DemoStatefulBuilderPage extends StatelessWidget {  @override  Widget build(BuildContext context) {    return Scaffold(      //状态构建器      body: buildStatefulBuilder(),    );  }}
  int _count = 0;  StatefulBuilder buildStatefulBuilder() {    return StatefulBuilder(      //构建状态改变的Widget      builder: (BuildContext context, void Function(void Function()) setState) {        //居中        return Center(          //手势识别          child: GestureDetector(            child: Text("早起的年轻人 $_count"),            //单击事件            onTap: () {              //刷新当前  StatefulBuilder 中的状态              setState(() {                _count++;              });            },          ),        );      },    );  }

第三种 使用 FutureBuilder & StreamBuilder

使用场景:异步UI更新
很多时候我们会依赖一些异步数据来动态更新UI,比如在打开一个页面时我们需要先从互联网上获取数据,在获取数据的过程中显示一个加载框,等获取到数据时我们再渲染页面;又比如我们想展示Stream(比如文件流、互联网数据接收流)的进度。当然StatefulWidget我们完全可以实现以上功能。但由于在实际开发中依赖异步数据更新UI的这种场景非常常见,并且当StatefulWidget中控件树较大时,更新一个属性导致整个树重建,消耗性能,因此Flutter专门提供了FutureBuilder和SteamBuilder两个组件来快速实现这种功能。

FutureBuilder的使用

  const FutureBuilder({    Key key,    this.future,          //获取数据的方法  获取用户异步处理获得数据的代码    this.initialData,   //初始的默认数据  初始化数据加载    @required this.builder  //数据快照   回调函数,暴露异步处理中的快照。这个是我们构建组件的主要组成。 主要来看一下它的构造函数:  }) : assert(builder != null),       super(key: key);
class _MyHomePageState extends State {  Future mockNetworkData() async {    return Future.delayed(Duration(seconds: 2), () => "我是从互联网上获取的数据");  }  @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(        title: Text(widget.title),      ),      body: Center(        child: Column(          mainAxisAlignment: MainAxisAlignment.center,          children: [            Text(              'You have pushed the button this many times:',            ),            FutureBuilder(              future: mockNetworkData(),                builder: (BuildContext context, AsyncSnapshot snapshot){              if(snapshot.connectionState == ConnectionState.done){                if(snapshot.hasError){                  // 请求失败,显示错误                  return Text("Error: ${snapshot.error}");                }else {                  // 请求成功,显示数据                  return Text("Contents: ${snapshot.data}");                }              }else {                return CircularProgressIndicator();              }            }),          ],        ),      ), // This trailing comma makes auto-fORMatting nicer for build methods.    );  }}

SteamBuilder的使用

class _MyHomePageState extends State {  Stream counter(){    return Stream.periodic(Duration(seconds: 1), (i){      return i;    });  }  @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(        title: Text(widget.title),      ),      body: Center(        child: Column(          mainAxisAlignment: MainAxisAlignment.center,          children: [            Text(              'You have pushed the button this many times:',            ),            StreamBuilder(                stream: counter(),                builder: (BuildContext context, AsyncSnapshot snapshot){                  if(snapshot.hasError){                    return Text("Error: ${snapshot.error}");                  }                  switch (snapshot.connectionState){                    case ConnectionState.none:                      return Text("没有Stream");                    case ConnectionState.waiting:                      return Text("等待数据、、、");                    case ConnectionState.active:                      return Text("active: ${snapshot.data}");                    case ConnectionState.done:                      return Text("Stream已关闭");                  }                  return null;                }),          ],        ),      ), // This trailing comma makes auto-formatting nicer for build methods.    );  }}

StreamBuilder与StreamController的详细使用:https://blog.csdn.net/u010194271/article/details/128024208

来源地址:https://blog.csdn.net/qq_27909209/article/details/130523131

--结束END--

本文标题: Flutter 局部刷新

本文链接: https://www.lsjlt.com/news/394830.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Flutter 局部刷新
    flutter的局部刷新的几种方式 第一种 :使用 GlobalKey 父组件中声明 GlobalKey textKey = GlobalKey(); textKey.currentState.局部刷新的方法(); 第二种 使用:State...
    99+
    2023-09-05
    flutter
  • 【Flutter】Flutter 实现局部刷新
    文章目录 一、前言二、Flutter 局部刷新的基本概念1. 什么是局部刷新2. 为什么需要局部刷新 三、Flutter 的局部刷新实现1. 使用 setState 实现局部刷新2. 使...
    99+
    2023-10-26
    flutter 前端 ios android 原力计划
  • Flutter StreamBuilder实现局部刷新实例详解
    目录前言StreamBuilder 简介StreamBuilder的实际应用总结前言 在flutter项目中,页面内直接调用setState方法会使得页面重新执行build方法,导致...
    99+
    2024-04-02
  • 如何实现ajax局部刷新
    这篇文章主要介绍了如何实现ajax局部刷新,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。ajax局部刷新 <script>&nb...
    99+
    2024-04-02
  • 用jquery实现局部刷新td
    在现代Web开发中,我们经常需要使用AJAX来更新部分页面内容,而jQuery是一款非常流行的JavaScript库,它提供了简便的语法和丰富的功能,让我们能够更加方便地实现局部刷新。本文将介绍如何使用jQuery实现局部刷新td,让你的页...
    99+
    2023-05-23
  • Vue实现页面的局部刷新(router-view页面刷新)
    利用Vue里面的provide+inject组合 首先需要修改App.vue。 <template> <!-- 公司管理 --> <di...
    99+
    2024-04-02
  • vue中如何实现页面刷新以及局部刷新
    vue中如何实现页面刷新以及局部刷新,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一.全页面刷新修改 App.vue,代码如下:<template> &n...
    99+
    2023-06-26
  • RecyclerView使用payload实现局部刷新
    本文实例为大家分享了RecyclerView使用payload实现局部刷新的具体代码,供大家参考,具体内容如下 列表局部刷新: 01.notifyDataSetChanged() 刷...
    99+
    2024-04-02
  • SpringBoot+thymeleaf+ajax实现局部刷新详情
    目录前言什么是局部刷新?优势和弊端?实现流程案列 前言 什么是局部刷新? 简而言之,就是当我发送一个请求到后端后拿到数据后返回当前 页面不会对整个页面进行重载而只对当前请求的模块进行...
    99+
    2024-04-02
  • android中recyclerview局部刷新怎么实现
    在Android中,通过RecyclerView的notifyItemChanged()方法可以实现局部刷新。该方法用于更新指定位置...
    99+
    2024-03-08
    android
  • vue中实现页面刷新以及局部刷新的方法
    目录一.全页面刷新二、局部刷新三、应用场景总结一.全页面刷新 1.修改 App.vue,代码如下: <template> <div id="app"> ...
    99+
    2024-04-02
  • Vue3页面局部刷新组件的刷新问题怎么解决
    步入正题,解决今天的问题代码首先我们要对app.vue进行修改代码:<template> <div id="app"> <nav-View v-show="login&...
    99+
    2023-05-17
    Vue3
  • JQuery中如何实现ajax局部刷新
    这篇文章给大家分享的是有关JQuery中如何实现ajax局部刷新的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JQuery 再谈ajax局部刷新。案例: 描述: 1. 点击登...
    99+
    2024-04-02
  • 如何使用局部刷新Ajax技术
    这篇文章主要介绍“如何使用局部刷新Ajax技术”,在日常操作中,相信很多人在如何使用局部刷新Ajax技术问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用局部刷新Ajax...
    99+
    2024-04-02
  • FlutterStatefulBuilder实现局部刷新实例详解
    目录前言页面的全量刷新StatefulBuilder简介StatefulBuilder的实际应用总结前言 flutter项目中,在页面数据较多的情况下使用全量刷新对性能消耗较大且容易...
    99+
    2024-04-02
  • Vue3中进行页面局部刷新组件刷新的操作方法
    目录前言开始操作vue2和vue3的区别vue2vue3Vue2和Vue3的钩子函数生命周期对照步入正题,解决今天的问题代码前言 今天在给vue3的项目中进行数据绑定的时候,发现我删...
    99+
    2022-12-20
    Vue3页面局部刷新 Vue3组件刷新 vue局部刷新
  • Vue如何实现页面的局部刷新
    本篇文章给大家分享的是有关Vue如何实现页面的局部刷新,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。利用Vue里面的provide+inject组合首先需要修改App.vue。...
    99+
    2023-06-22
  • Ajax如何实现局部刷新的方法
    本篇内容主要讲解“Ajax如何实现局部刷新的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Ajax如何实现局部刷新的方法”吧!前言最近复习了一下jQuery的一些内容,特此整理一下一些能用的...
    99+
    2023-06-08
  • AJAX怎么实现异步和局部刷新
    小编给大家分享一下AJAX怎么实现异步和局部刷新,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Overriew: onReady...
    99+
    2024-04-02
  • ajax局部和整体刷新的示例分析
    本篇文章为大家展示了ajax局部和整体刷新的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先我先来来说一下方案。$p.load(url,data,func...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作