我可以在颤振中从 UI 外部使用 riverpod 触发 UI 重建吗?

时间:2021-07-09 05:46:17

标签: flutter riverpod

背景

我正在做的是从 JSON 请求中获取用户数据,然后立即将该数据存储在本地安全存储中,如下所示:

Future<void> ProcessUserData(appdata)
async {

  String _newuserid = appdata['userid'] ?? '0';

    UserSecureStorage.setUserid(_newuserid);

  MyLocalUserData().getUserData;  // This is an attempt to trigger a UI rebuild but is a fail, see explanation below

}

然后我有一个单独的类 MyLocalUserData,它将相同的数据拉入一个由提供者监视的类

class MyLocalUserData with ChangeNotifier
{


  String _userid =  '';

  String get userid => _userid;


  Future<void> get getUserData async {
    _userid = await UserSecureStorage.getUserid() ?? '';
    notifyListeners();
  }
}
final userDataProvider = ChangeNotifierProvider<MyLocalUserData>((ref) {
  return MyLocalUserData();
});

然后会监视此提供程序,并使用该信息更新 UI 文本小部件

class UserDataConsumer extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    
    return Container(
        child:Consumer(
          builder: (context, watch, child){

            var data = watch(userDataProvider);
            return Text('Userid:'+data.userid);

          }
        )
    );
  }
}

现在,如果我在 UI 中对我的 Provider 调用 context.read,那么这一切都很好。我的 UI 元素更新为新的 userid

context.read(userDataProvider).getUserData;

事件链总结

对某些数据发出 JSON 请求
==> ProcessUserData(jsondata)
==> 存储数据 (UserSecureStorage)
==> 用户单击按钮以通过 MyLocalUserData.getUserData 调用 context.read(userDataProvider).getUserData;,该按钮将从存储中获取用户数据并将其存储在 ChangeNotifier
==> UI 元素通过 UserDataConsumer 更新,后者正在监视 ChangeNotifier。

我想做什么

我希望这个过程是无缝的,不需要用户点击按钮来通过 MyLocalUserData.getUserData 调用 context.read(userDataProvider).getUserData;

所以我尝试直接将 MyLocalUserData().getUserData; 插入到 ProcessUserData 函数中。希望 MyLocalUserData 内的数据更改会触发 ChangeNotifier 但它不会。查看第一个代码块以了解我放置它的位置。

所以我的问题/问题的根源是,是否可以按照我尝试的方式从 UI 外部触发这一系列事件?

如果没有

如果没有,是否有另一种方法可以完成所有这些操作,以便存储我的数据并绕过让用户与小部件交互以更新 UI?

谢谢!

0 个答案:

没有答案