我不能在Container TextFormFielText之间填充.就像这张照片一样重叠.

enter image description here

这是我的问题代码

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Profile'),
      ),
      body: Stack(
        children: [
          Container(
            width: double.infinity,
            height: double.infinity,
            color: Colors.blue, // Second layer background color
          ),
          Positioned(
            top: 0,
            left: 10,
            right: 10,
            bottom: 0,
            child: Container(
              child: ProfileForm(),
              margin: EdgeInsets.only(top: 48),
              height: 500,
              decoration: BoxDecoration(
                color: Colors.white,
                borderRadius: BorderRadius.circular(16.0),
              ),
            ),
          ),
          Positioned(
            top: 16,
            left: 0,
            right: 0,
            child: Align(
              alignment: Alignment.topCenter,
              child: Padding(
                padding: const EdgeInsets.symmetric(horizontal: 20),
                child: Column(
                  children: [
                    CircleAvatar(
                      radius: 40.0,
                      backgroundColor: Colors.white,
                      child: CircleAvatar(
                        child: Align(
                          alignment: Alignment.bottomRight,
                          child: CircleAvatar(
                            backgroundColor: Colors.white,
                            radius: 12.0,
                            child: Icon(
                              Icons.camera_alt,
                              size: 15.0,
                              color: Color(0xFF404040),
                            ),
                          ),
                        ),
                        radius: 38.0,
                        backgroundImage: AssetImage(
                          'assets/images/user-image-default.png',
                        ),
                      ),
                    ),
                    SizedBox(height: 8),
                    Text(
                      'John Doe',
                      style: TextStyle(
                        fontWeight: FontWeight.bold,
                        fontSize: 18,
                      ),
                    ),
                    Text(
                      'john.doe@example.com',
                      style: TextStyle(
                        fontSize: 16,
                      ),
                    ),
                  ],
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

推荐答案

这里有一个基本的例子,没有硬编码任何大小/高度在你的Widget上,高度是在你的头被渲染后计算出来的.

结果:

enter image description here

代码:

class MyWidget extends StatefulWidget {
  const MyWidget({super.key});

  @override
  State<MyWidget> createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  final _keyUserData = GlobalKey();
  double _userDataHeight = 0.0;

  @override
  void initState() {
    WidgetsBinding.instance.addPostFrameCallback((_) {
      setState(() {
        _userDataHeight = _keyUserData.currentContext?.size?.height ?? 0.0;
      });
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    const avatarSize = 38.0;
    return Scaffold(
      appBar: AppBar(
        title: const Text('Profile'),
      ),
      backgroundColor: Colors.blue,
      body: Container(
        margin: const EdgeInsets.symmetric(vertical: 48, horizontal: 12),
        decoration: BoxDecoration(
          color: Colors.white,
          borderRadius: BorderRadius.circular(16.0),
        ),
        child: Stack(
          clipBehavior: Clip.none,
          children: [
            Positioned(
              left: 0,
              right: 0,
              top: -avatarSize / 2,
              child: Column(
                key: _keyUserData,
                mainAxisSize: MainAxisSize.min,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: const [
                  Center(
                    child: CircleAvatar(
                      radius: avatarSize,
                      backgroundImage: AssetImage(
                        'assets/images/user-image-default.png',
                      ),
                      child: Align(
                        alignment: Alignment.bottomRight,
                        child: CircleAvatar(
                          backgroundColor: Colors.white,
                          radius: 12.0,
                          child: Icon(
                            Icons.camera_alt,
                            size: 15.0,
                            color: Color(0xFF404040),
                          ),
                        ),
                      ),
                    ),
                  ),
                  SizedBox(height: 8),
                  Text(
                    'John Doe',
                    style: TextStyle(
                      fontWeight: FontWeight.bold,
                      fontSize: 18,
                    ),
                  ),
                  Text(
                    'john.doe@example.com',
                    style: TextStyle(
                      fontSize: 16,
                    ),
                  ),
                ],
              ),
            ),
            Positioned(
              left: 0,
              right: 0,
              top: _userDataHeight,
              child: const ProfileForm(),
            ),
          ],
        ),
      ),
    );
  }
}

class ProfileForm extends StatelessWidget {
  const ProfileForm({super.key});

  @override
  Widget build(BuildContext context) {
    return const Padding(
      padding: EdgeInsets.symmetric(horizontal: 30.0),
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          TextField(
            decoration: InputDecoration(
              labelText: 'First Name',
              hintText: 'Enter your first name',
            ),
          ),
          TextField(
            decoration: InputDecoration(
              labelText: 'Last Name',
              hintText: 'Enter your last name',
            ),
          ),
          TextField(
            decoration: InputDecoration(
              labelText: 'Email',
              hintText: 'Enter your email',
            ),
          ),
        ],
      ),
    );
  }
}

Flutter相关问答推荐

如何更改默认应用程序启动器/启动屏幕

Flutter:sqflite DB

为什么我需要等待重新访问Firestore数据库,即使它已经做了之前?

Flutter 隔离.使用多个参数运行

为什么当我使用Riverpod更新状态时,列表会被刷新?

使小部件处于有状态状态会导致hasSize异常

SingleChildScrollView在ErrorWidget.builder中不工作

在Flutter 小部件测试中找不到框中的AssetImage装饰

Wired Firebase错误-[CLOUD_FIRESTORE/UNAvailable]该服务当前不可用

如何获取flutter中gridview项目占用的高度和宽度?

Flutter Dismissible 不会在 startToEnd 滑动时被关闭

如何为文本主题设置多种 colored颜色 ?

如何在 flutter 的 onChanged(更改字符)处更改 TextField 边框 colored颜色 ?

容器在发布模式下显示灰色框(抖动)

如何判断 text.contains() 是否包含多个值

一个或多个插件需要更高的 Android SDK 版本

如何在Flutter 中水平滚动堆叠定位的小部件?

Flutter Desktop,如何获取windows用户配置文件名称?

小部件库捕获的 Flutter 异常

Flutter:如何将 AssetImage 转换为 Unit8List?