我正在做的是从 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?
谢谢!