Flutter 在运行时更改抽屉中的ProfileImage
我的抽屉侧菜单中有一个图像,它的路径存储在名为Flutter 在运行时更改抽屉中的ProfileImage,flutter,Flutter,我的抽屉侧菜单中有一个图像,它的路径存储在名为userdata的最终对象中: class MyDrawer extends StatelessWidget { MyDrawer({Key key, this.userdata}) : super(key: key); final User userdata; @override Widget build(BuildContext context) { return new Drawer( child: Lis
userdata
的最终对象中:
class MyDrawer extends StatelessWidget {
MyDrawer({Key key, this.userdata}) : super(key: key);
final User userdata;
@override
Widget build(BuildContext context) {
return new Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: <Widget>[
if (userdata != null) ...[
DrawerHeader(
decoration: BoxDecoration(color: Colors.green),
child: Stack(children: <Widget>[
Align(
alignment: Alignment.centerLeft,
child: ClipOval(
child: userdata.image == '' || userdata.image == null
? CircleAvatar(
radius: 50,
backgroundColor: Colors.white,
backgroundImage: AssetImage('assets/images/avatar.png'))
: Image.network(
userdata.image,
width: 100,
height: 100,
fit: BoxFit.cover,
),
)),
我还有一个存储类,其中还提供了userdata对象:
class UserStorage {
Future<User> getUserData() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String userdata = prefs.getString('userdata') ?? '';
if (userdata != "") {
dynamic user = json.decode(userdata);
return User.fromJson(user);
} else {
return null;
}
}
}
类用户存储{
未来的getUserData()异步{
SharedReferences prefs=等待SharedReferences.getInstance();
字符串userdata=prefs.getString('userdata')??“”;
如果(userdata!=“”){
动态用户=json.decode(userdata);
返回User.fromJson(User);
}否则{
返回null;
}
}
}
将您的用户数据
内容保存在全局变量中globals.dart
文件
library globals;
ValueNotifier userDataNotifier = ValueNotifier(null);
将MyDrawer
类转换为StatefulWidget
并删除其中的User
变量。然后在ValueListenableBuilder
小部件中使用变量
将“globals.dart”作为全局导入;
//
发布你的
profile.dart
页面内容我想我添加了profile.dart中的相关部分。。这只是一个简单的表单,用户可以更新他们的用户相关数据:)非常感谢,这太棒了。。是否可以将valuelistenablebuilder也分配给内部存储器?我的userstorage服务中有一个类getUserdata(),它还提供了所需的userdata对象?我在我的问题中添加了userstorage服务:)或者使用两个全局实体(存储和全局实体)更好吗?在我更新存储的服务中,我还更新了全局实体?但对我来说,监视全球2个百分点的人感觉有点不对
library globals;
ValueNotifier userDataNotifier = ValueNotifier(null);
class MyDrawer extends StatefulWidget {
MyDrawer({Key key}) : super(key: key);
@override
_MyDrawerState createState() => _MyDrawerState();
}
class _MyDrawerState extends State<MyDrawer> {
@override
Widget build(BuildContext context) {
return Drawer(
//...
Align(
//...
child: ValueListenableBuilder(
valueListenable: globals.userDataNotifier,
builder: (context, userdata, _) {
return ClipOval(
child: userdata.image == '' || userdata.image == null
? CircleAvatar(
radius: 50,
backgroundColor: Colors.white,
backgroundImage: AssetImage('assets/images/avatar.png'))
: Image.network(
userdata.image,
width: 100,
height: 100,
fit: BoxFit.cover,
),
);
},
),
),
);
}
}
import 'globals.dart' as globals;
// ...
changeUser() async {
try {
User userdata = await ProfileApi().updateProfile(this._username.text, this._email.text, this._firstname.text, this._lastname.text);
// simply change the content of userData
globals.userDataNotifier = userdata;
Fluttertoast.showToast(msg: 'Profile updated');
} on Exception catch (error) {
Fluttertoast.showToast(msg: error.toString());
return;
}
}