iOS14 widget 刷新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS14 widget 刷新相关的知识,希望对你有一定的参考价值。

参考技术A

调试的时候,想1分钟刷新一下 widget的状态,基本可以成功,但是上线后大概率不会按照设计的时机更新。下面是苹果员工的回答:
Updating every minute is far too aggressive. Widgets have a limited number of updates and if you were to try to update every minute, you\'ll quickly run out of updates. While debugging with Xcode these limits are not imposed, but if you\'re running your app outside of Xcode you\'d see the behavior you\'re describing where your widget would stop updating.

What happens if you update every 15 minutes? If that doesn\'t work, please file a Feedback Assistant report with the details of what you\'re doing and the results you see.

------ WidgetKit won\'t request a new timeline at the end

宿主App的数据有更新时,可以主动刷新 widget UI。具体怎么做呢?对于宿主App是 OC 写的项目,需要下面两步:

刷新时,直接调用

我们刷新 widget 是因为有数据更新了所以要刷新 UI。那 widget 如何取出宿主App 的数据进行刷新呢?也需要两步:

定时刷新小组件时,在 TimelineProvider 中提供一系列的数据以及刷新周期。比如例子中提到的 小龙参加战斗 1小时 掉血 25%,那么添加5个刷新日期和数据:

具体的例子和 刷新策略 可以参考: https://developer.apple.comdocumentation/widgetkit/timelineprovider
https://developer.apple.com/documentation/widgetkit/keeping-a-widget-up-to-date

Flutter 实现局部刷新

当widget需要进行刷新时,我们可以通过调用widget的setState方法来实现,setState随后会调用State的build方法来进行重建

  //请求刷新
  setState(()
    
  );


  #State<T extends StatefulWidget>
  @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<StatefulWidget> createState() 
    return PartRefreshWidgetState(_child);
  



class PartRefreshWidgetState extends State<PartRefreshWidget> 

  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<GlobalKeyDemo> 
  int _count = 0;

  //使用1 创建GlobalKey
  GlobalKey<PartRefreshWidgetState> 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: <Widget>[
              //使用2 创建通用局部刷新widget
              PartRefreshWidget(globalKey, () 
                ///创建需要局部刷新的widget
                return Text(
                  '变化的:$_count',
                  style: TextStyle(color: Colors.green),
                );
              ),
              Text('不变的: $_count'),
              RaisedButton(
                onPressed: () 
                  //点击
                  _count++;
                  //使用3调用刷新方法
                  globalKey.currentState.update();
                ,
              ),
            ],
          ),
        )
    );
  

效果如下图所示:

 

以上是关于iOS14 widget 刷新的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 实现局部刷新

iOS 14 小部件不刷新

iOS 14 意外发现:iPhone 12 或配备高刷新率屏幕

Flutter局部刷新方法

Flutter 局部Widget刷新

Flutter 局部Widget刷新