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;
  }
}