Browse Source

fix: 为WebView和底部弹窗添加SafeArea避免刘海屏遮挡

为所有WebView页面和底部弹窗添加SafeArea包装,设置top: false以避免系统状态栏区域遮挡内容。同时调整底部按钮位置,考虑底部安全区域边距,确保在刘海屏设备上UI显示正常。
newdev_shunjiawei
lxm 8 months ago
parent
commit
ddda2b8ad0
  1. 7
      lib/modules/common/webview_page.dart
  2. 103
      lib/modules/goods/views/goodsai_view.dart
  3. 67
      lib/modules/goods/views/goodsmeet_view.dart
  4. 65
      lib/modules/goods/views/goodstrans_view.dart
  5. 105
      lib/modules/goods/views/goodsvip_view.dart
  6. 113
      lib/modules/meeting/views/bottomSheet/ai_bottom_sheet.dart
  7. 15
      lib/modules/meeting/views/bottomSheet/edit_title_bottom_sheet.dart
  8. 11
      lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart
  9. 35
      lib/modules/meeting/views/bottomSheet/member_bottom_sheet.dart
  10. 15
      lib/modules/meeting/views/bottomSheet/more_bottom_sheet.dart
  11. 15
      lib/modules/meeting/views/bottomSheet/record_language_bottom_sheet.dart
  12. 17
      lib/modules/meeting/views/bottomSheet/second_level_bottom_sheet.dart
  13. 15
      lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart
  14. 15
      lib/modules/meeting/views/bottomSheet/speaker_all_bottom_sheet.dart
  15. 15
      lib/modules/meeting/views/bottomSheet/speaker_bottom_sheet.dart
  16. 7
      lib/modules/meeting/views/tabs/mind_map_tab.dart
  17. 2
      lib/modules/meeting/views/tabs/overview_tab.dart
  18. 12
      lib/modules/meeting/views/tabs/speech_tab.dart
  19. 19
      lib/modules/meeting/views/tabs/summary_tab.dart
  20. 37
      lib/modules/payment/views/payment_view.dart
  21. 27
      lib/modules/permissions/views/permissions_view.dart

7
lib/modules/common/webview_page.dart

@ -41,8 +41,11 @@ class WebViewPage extends StatelessWidget {
),
centerTitle: true,
),
body: WebViewWidget(
controller: controller,
body: SafeArea(
top: false,
child: WebViewWidget(
controller: controller,
),
),
);
}

103
lib/modules/goods/views/goodsai_view.dart

@ -30,60 +30,63 @@ class GoodsaiView extends GetView<GoodsaiController> {
),
centerTitle: true,
),
body: Obx(() {
// 访问刷新信号以建立依赖关系:用户信息变化时触发重建
final _ = User.refreshTick.value;
Widget content;
if (controller.loading.value) {
content = const Center(child: CircularProgressIndicator());
} else if (controller.error.isNotEmpty) {
content = Center(child: Text(controller.error.value));
} else {
content = ListView(
padding: EdgeInsets.all(16.w),
children: [
_buildHeader(isDarkMode),
SizedBox(height: 12.h),
_buildUsageCard(isDarkMode),
SizedBox(height: 16.h),
Text(
'availablePackages'.tr,
style: TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.w600,
color: isDarkMode ? Colors.white : Colors.black,
body: SafeArea(
top: false,
child: Obx(() {
// 访问刷新信号以建立依赖关系:用户信息变化时触发重建
final _ = User.refreshTick.value;
Widget content;
if (controller.loading.value) {
content = const Center(child: CircularProgressIndicator());
} else if (controller.error.isNotEmpty) {
content = Center(child: Text(controller.error.value));
} else {
content = ListView(
padding: EdgeInsets.all(16.w),
children: [
_buildHeader(isDarkMode),
SizedBox(height: 12.h),
_buildUsageCard(isDarkMode),
SizedBox(height: 16.h),
Text(
'availablePackages'.tr,
style: TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.w600,
color: isDarkMode ? Colors.white : Colors.black,
),
),
),
SizedBox(height: 8.h),
...controller.items.map((item) => Padding(
padding: EdgeInsets.only(bottom: 12.h),
child: _buildCard(item, isDarkMode),
)),
SizedBox(height: 16.h),
_buildFeaturesSection(isDarkMode),
SizedBox(height: 16.h),
GoodsFooterSection(isDarkMode: isDarkMode),
],
);
}
return Stack(
children: [
content,
if (controller.isPaying.value)
Positioned.fill(
child: AbsorbPointer(
absorbing: true,
child: Container(
color: Colors.black.withOpacity(0.35),
child: const Center(
child: CircularProgressIndicator(),
SizedBox(height: 8.h),
...controller.items.map((item) => Padding(
padding: EdgeInsets.only(bottom: 12.h),
child: _buildCard(item, isDarkMode),
)),
SizedBox(height: 16.h),
_buildFeaturesSection(isDarkMode),
SizedBox(height: 16.h),
GoodsFooterSection(isDarkMode: isDarkMode),
],
);
}
return Stack(
children: [
content,
if (controller.isPaying.value)
Positioned.fill(
child: AbsorbPointer(
absorbing: true,
child: Container(
color: Colors.black.withOpacity(0.35),
child: const Center(
child: CircularProgressIndicator(),
),
),
),
),
),
],
);
}),
],
);
}),
),
);
}

67
lib/modules/goods/views/goodsmeet_view.dart

@ -37,38 +37,41 @@ class GoodsmeetView extends GetView<GoodsmeetController> {
),
centerTitle: true,
),
body: Obx(() {
// 访问刷新信号以建立依赖关系:用户信息变化时触发重建
final _ = User.refreshTick.value;
if (controller.loading.value) {
return const Center(child: CircularProgressIndicator());
}
if (controller.error.isNotEmpty) {
return Center(child: Text(controller.error.value));
}
return ListView.separated(
padding: EdgeInsets.all(16.w),
itemCount: controller.items.length + 4,
separatorBuilder: (_, __) => SizedBox(height: 12.h),
itemBuilder: (_, index) {
if (index == 0) {
return _buildHeader(isDarkMode);
}
if (index == 1) {
return _buildUsageCard(isDarkMode);
}
final itemIndex = index - 2;
if (itemIndex < controller.items.length) {
final item = controller.items[itemIndex];
return _buildCard(item, isDarkMode);
}
if (index == controller.items.length + 2) {
return _buildFeaturesSection(isDarkMode);
}
return GoodsFooterSection(isDarkMode: isDarkMode);
},
);
}),
body: SafeArea(
top: false,
child: Obx(() {
// 访问刷新信号以建立依赖关系:用户信息变化时触发重建
final _ = User.refreshTick.value;
if (controller.loading.value) {
return const Center(child: CircularProgressIndicator());
}
if (controller.error.isNotEmpty) {
return Center(child: Text(controller.error.value));
}
return ListView.separated(
padding: EdgeInsets.all(16.w),
itemCount: controller.items.length + 4,
separatorBuilder: (_, __) => SizedBox(height: 12.h),
itemBuilder: (_, index) {
if (index == 0) {
return _buildHeader(isDarkMode);
}
if (index == 1) {
return _buildUsageCard(isDarkMode);
}
final itemIndex = index - 2;
if (itemIndex < controller.items.length) {
final item = controller.items[itemIndex];
return _buildCard(item, isDarkMode);
}
if (index == controller.items.length + 2) {
return _buildFeaturesSection(isDarkMode);
}
return GoodsFooterSection(isDarkMode: isDarkMode);
},
);
}),
),
);
}

65
lib/modules/goods/views/goodstrans_view.dart

@ -37,37 +37,40 @@ class GoodstransView extends GetView<GoodstransController> {
),
centerTitle: true,
),
body: Obx(() {
final _ = User.refreshTick.value;
if (controller.loading.value) {
return const Center(child: CircularProgressIndicator());
}
if (controller.error.isNotEmpty) {
return Center(child: Text(controller.error.value));
}
return ListView.separated(
padding: EdgeInsets.all(16.w),
itemCount: controller.items.length + 4,
separatorBuilder: (_, __) => SizedBox(height: 12.h),
itemBuilder: (_, index) {
if (index == 0) {
return _buildHeader(isDarkMode);
}
if (index == 1) {
return _buildUsageCard(isDarkMode);
}
final itemIndex = index - 2;
if (itemIndex < controller.items.length) {
final item = controller.items[itemIndex];
return _buildCard(item, isDarkMode);
}
if (index == controller.items.length + 2) {
return _buildFeaturesSection(isDarkMode);
}
return GoodsFooterSection(isDarkMode: isDarkMode);
},
);
}),
body: SafeArea(
top: false,
child: Obx(() {
final _ = User.refreshTick.value;
if (controller.loading.value) {
return const Center(child: CircularProgressIndicator());
}
if (controller.error.isNotEmpty) {
return Center(child: Text(controller.error.value));
}
return ListView.separated(
padding: EdgeInsets.all(16.w),
itemCount: controller.items.length + 4,
separatorBuilder: (_, __) => SizedBox(height: 12.h),
itemBuilder: (_, index) {
if (index == 0) {
return _buildHeader(isDarkMode);
}
if (index == 1) {
return _buildUsageCard(isDarkMode);
}
final itemIndex = index - 2;
if (itemIndex < controller.items.length) {
final item = controller.items[itemIndex];
return _buildCard(item, isDarkMode);
}
if (index == controller.items.length + 2) {
return _buildFeaturesSection(isDarkMode);
}
return GoodsFooterSection(isDarkMode: isDarkMode);
},
);
}),
),
);
}

105
lib/modules/goods/views/goodsvip_view.dart

@ -38,62 +38,65 @@ class GoodsvipView extends GetView<GoodsvipController> {
),
centerTitle: true,
),
body: Obx(() {
final userTick = User.refreshTick.value;
Widget content;
if (controller.loading.value) {
content = const Center(child: CircularProgressIndicator());
} else if (controller.error.isNotEmpty) {
content = Center(child: Text(controller.error.value));
} else {
final Map<UsageType, List<DBGoods>> grouped = {};
for (final g in controller.items) {
grouped.putIfAbsent(g.usagetype, () => []).add(g);
}
final order = [UsageType.Vip];
final children = <Widget>[];
children.add(_buildFeaturesSection(isDarkMode));
children.add(SizedBox(height: 16.h));
// children.add(_buildScenesSection(isDarkMode));
// children.add(SizedBox(height: 16.h));
for (int i = 0; i < order.length; i++) {
final t = order[i];
final list = grouped[t];
if (list == null || list.isEmpty) continue;
children.add(_buildTypeSection(t, list, isDarkMode));
if (i != order.length - 1) {
children.add(SizedBox(height: 16.h));
children.add(
Divider(color: isDarkMode ? Colors.white24 : Colors.black12));
children.add(SizedBox(height: 16.h));
body: SafeArea(
top: false,
child: Obx(() {
final userTick = User.refreshTick.value;
Widget content;
if (controller.loading.value) {
content = const Center(child: CircularProgressIndicator());
} else if (controller.error.isNotEmpty) {
content = Center(child: Text(controller.error.value));
} else {
final Map<UsageType, List<DBGoods>> grouped = {};
for (final g in controller.items) {
grouped.putIfAbsent(g.usagetype, () => []).add(g);
}
final order = [UsageType.Vip];
final children = <Widget>[];
children.add(_buildFeaturesSection(isDarkMode));
children.add(SizedBox(height: 16.h));
// children.add(_buildScenesSection(isDarkMode));
// children.add(SizedBox(height: 16.h));
for (int i = 0; i < order.length; i++) {
final t = order[i];
final list = grouped[t];
if (list == null || list.isEmpty) continue;
children.add(_buildTypeSection(t, list, isDarkMode));
if (i != order.length - 1) {
children.add(SizedBox(height: 16.h));
children.add(Divider(
color: isDarkMode ? Colors.white24 : Colors.black12));
children.add(SizedBox(height: 16.h));
}
}
}
children.add(GoodsFooterSection(isDarkMode: isDarkMode));
content = ListView(
key: ValueKey(userTick),
padding: EdgeInsets.all(16.w),
children: children,
);
}
return Stack(
children: [
content,
if (controller.isPaying.value)
Positioned.fill(
child: AbsorbPointer(
absorbing: true,
child: Container(
color: Colors.black.withOpacity(0.35),
child: const Center(
child: CircularProgressIndicator(),
children.add(GoodsFooterSection(isDarkMode: isDarkMode));
content = ListView(
key: ValueKey(userTick),
padding: EdgeInsets.all(16.w),
children: children,
);
}
return Stack(
children: [
content,
if (controller.isPaying.value)
Positioned.fill(
child: AbsorbPointer(
absorbing: true,
child: Container(
color: Colors.black.withOpacity(0.35),
child: const Center(
child: CircularProgressIndicator(),
),
),
),
),
),
],
);
}),
],
);
}),
),
);
}

113
lib/modules/meeting/views/bottomSheet/ai_bottom_sheet.dart

@ -74,65 +74,68 @@ class _AIBottomSheetState extends State<AIBottomSheet> {
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.symmetric(horizontal: 12.w),
constraints: BoxConstraints(
maxHeight: 1.sh - 50.h - MediaQuery.of(context).viewInsets.bottom,
),
child: Column(
children: [
Container(
padding: EdgeInsets.symmetric(vertical: 10.w),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
26.horizontalSpace,
Text(
'Ask AI',
style: TextStyle(
fontSize: 16.sp,
color: Colors.black87,
fontWeight: FontWeight.bold,
),
),
GestureDetector(
onTap: () => Get.back(),
child: Container(
width: 26.w,
height: 26.w,
decoration: BoxDecoration(
color: Colors.grey[100],
borderRadius: BorderRadius.circular(26.r),
return SafeArea(
top: false,
child: Container(
padding: EdgeInsets.symmetric(horizontal: 12.w),
constraints: BoxConstraints(
maxHeight: 1.sh - 50.h - MediaQuery.of(context).viewInsets.bottom,
),
child: Column(
children: [
Container(
padding: EdgeInsets.symmetric(vertical: 10.w),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
26.horizontalSpace,
Text(
'Ask AI',
style: TextStyle(
fontSize: 16.sp,
color: Colors.black87,
fontWeight: FontWeight.bold,
),
child: Icon(
Icons.close,
size: 18.w,
color: Colors.grey[400],
),
GestureDetector(
onTap: () => Get.back(),
child: Container(
width: 26.w,
height: 26.w,
decoration: BoxDecoration(
color: Colors.grey[100],
borderRadius: BorderRadius.circular(26.r),
),
child: Icon(
Icons.close,
size: 18.w,
color: Colors.grey[400],
),
),
),
),
],
],
),
),
),
Expanded(
child: _dataList.isNotEmpty
? Align(
alignment: Alignment.topCenter,
child: ListView.builder(
controller: _scrollController,
itemCount: _dataList.length,
shrinkWrap: true,
reverse: true,
itemBuilder: (BuildContext context, int index) {
Map data = _dataList[index];
return _item(index, data);
},
),
)
: _empty(),
),
_inputBox(),
],
Expanded(
child: _dataList.isNotEmpty
? Align(
alignment: Alignment.topCenter,
child: ListView.builder(
controller: _scrollController,
itemCount: _dataList.length,
shrinkWrap: true,
reverse: true,
itemBuilder: (BuildContext context, int index) {
Map data = _dataList[index];
return _item(index, data);
},
),
)
: _empty(),
),
_inputBox(),
],
),
),
);
}

15
lib/modules/meeting/views/bottomSheet/edit_title_bottom_sheet.dart

@ -11,11 +11,13 @@ class EditTitleBottomSheet extends GetView<MeetingHomeController> {
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 12.w),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
return SafeArea(
top: false,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 12.w),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
padding: EdgeInsets.symmetric(vertical: 10.w),
child: Row(
@ -135,7 +137,8 @@ class EditTitleBottomSheet extends GetView<MeetingHomeController> {
],
),
),
],
],
),
),
);
}

11
lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart

@ -88,9 +88,11 @@ class _GenerateBottomSheetState extends State<GenerateBottomSheet> {
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
return SafeArea(
top: false,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.w),
child: Row(
@ -370,7 +372,8 @@ class _GenerateBottomSheetState extends State<GenerateBottomSheet> {
),
),
),
],
],
),
);
}

35
lib/modules/meeting/views/bottomSheet/member_bottom_sheet.dart

@ -9,22 +9,24 @@ class MemberBottomSheet extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.symmetric(horizontal: 12.w),
decoration: BoxDecoration(
borderRadius: BorderRadius.vertical(
top: Radius.circular(12.r),
),
image: const DecorationImage(
alignment: Alignment.topCenter,
image: AssetImage('assets/images/mine-background.png'),
fit: BoxFit.fitWidth,
return SafeArea(
top: false,
child: Container(
padding: EdgeInsets.symmetric(horizontal: 12.w),
decoration: BoxDecoration(
borderRadius: BorderRadius.vertical(
top: Radius.circular(12.r),
),
image: const DecorationImage(
alignment: Alignment.topCenter,
image: AssetImage('assets/images/mine-background.png'),
fit: BoxFit.fitWidth,
),
),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Container(
margin: EdgeInsets.only(top: 12.w),
alignment: Alignment.centerRight,
@ -130,7 +132,8 @@ class MemberBottomSheet extends StatelessWidget {
],
),
),
],
],
),
),
);
}

15
lib/modules/meeting/views/bottomSheet/more_bottom_sheet.dart

@ -19,11 +19,13 @@ class _MoreBottomSheetState extends State<MoreBottomSheet> {
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.w),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
return SafeArea(
top: false,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.w),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(height: 10.w),
_shareItem(Icons.refresh, 'reSummarize'.tr, //重新总结
onTap: _detailsController.meetingDetails.value.tasktype >= 5 &&
@ -52,7 +54,8 @@ class _MoreBottomSheetState extends State<MoreBottomSheet> {
Get.back();
Get.back();
}),
],
],
),
),
);
}

15
lib/modules/meeting/views/bottomSheet/record_language_bottom_sheet.dart

@ -29,11 +29,13 @@ class _RecordLanguageBottomSheetState extends State<RecordLanguageBottomSheet> {
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 12.w),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
return SafeArea(
top: false,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 12.w),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
padding: EdgeInsets.symmetric(vertical: 10.w),
child: Row(
@ -88,7 +90,8 @@ class _RecordLanguageBottomSheetState extends State<RecordLanguageBottomSheet> {
},
),
),
],
],
),
),
);
}

17
lib/modules/meeting/views/bottomSheet/second_level_bottom_sheet.dart

@ -21,12 +21,14 @@ class _SecondLevelBottomSheetState extends State<SecondLevelBottomSheet> {
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 12.w),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
return SafeArea(
top: false,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 12.w),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: EdgeInsets.symmetric(vertical: 10.w),
child: Row(
@ -157,7 +159,8 @@ class _SecondLevelBottomSheetState extends State<SecondLevelBottomSheet> {
),
),
),
],
],
),
),
);
}

15
lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart

@ -31,11 +31,13 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 12.w),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
return SafeArea(
top: false,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 12.w),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
padding: EdgeInsets.symmetric(vertical: 10.w),
child: Row(
@ -267,7 +269,8 @@ class _ShareBottomSheetState extends State<ShareBottomSheet> {
],
),
),
],
],
),
),
);
}

15
lib/modules/meeting/views/bottomSheet/speaker_all_bottom_sheet.dart

@ -89,11 +89,13 @@ class _SpeakerAllBottomSheetState extends State<SpeakerAllBottomSheet> {
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 12.w),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
return SafeArea(
top: false,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 12.w),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
padding: EdgeInsets.symmetric(vertical: 10.w),
child: Row(
@ -487,7 +489,8 @@ class _SpeakerAllBottomSheetState extends State<SpeakerAllBottomSheet> {
],
),
),
],
],
),
),
);
}

15
lib/modules/meeting/views/bottomSheet/speaker_bottom_sheet.dart

@ -60,11 +60,13 @@ class _SpeakerBottomSheetState extends State<SpeakerBottomSheet> {
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 12.w),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
return SafeArea(
top: false,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 12.w),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
padding: EdgeInsets.symmetric(vertical: 10.w),
child: Row(
@ -228,7 +230,8 @@ class _SpeakerBottomSheetState extends State<SpeakerBottomSheet> {
),
),
),
],
],
),
),
);
}

7
lib/modules/meeting/views/tabs/mind_map_tab.dart

@ -21,8 +21,11 @@ class _MindMapTabState extends State<MindMapTab>
@override
Widget build(BuildContext context) {
super.build(context);
return WebViewWidget(
controller: _controller.webViewController,
return SafeArea(
top: false,
child: WebViewWidget(
controller: _controller.webViewController,
),
);
}
}

2
lib/modules/meeting/views/tabs/overview_tab.dart

@ -93,7 +93,7 @@ class _OverviewTabState extends State<OverviewTab> {
: _empty(),
Obx(
() => Positioned(
bottom: 20.w,
bottom: MediaQuery.of(context).padding.bottom + 20.w,
left: 0,
right: 0,
child: Row(

12
lib/modules/meeting/views/tabs/speech_tab.dart

@ -276,7 +276,7 @@ class SpeechTab extends GetView<MeetingDetailsController> {
),
Obx(
() => Positioned(
bottom: 20.w,
bottom: MediaQuery.of(context).padding.bottom + 20.w,
left: 0,
right: 0,
child: Row(
@ -344,8 +344,9 @@ class SpeechTab extends GetView<MeetingDetailsController> {
Get.bottomSheet(
const GenerateBottomSheet(),
isScrollControlled: true,
backgroundColor:
isDarkMode ? Colors.grey[800] : Colors.grey[100],
backgroundColor: isDarkMode
? Colors.grey[800]
: Colors.grey[100],
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(
top: Radius.circular(12.r),
@ -365,8 +366,9 @@ class SpeechTab extends GetView<MeetingDetailsController> {
Get.bottomSheet(
const GenerateBottomSheet(),
isScrollControlled: true,
backgroundColor:
isDarkMode ? Colors.grey[800] : Colors.grey[100],
backgroundColor: isDarkMode
? Colors.grey[800]
: Colors.grey[100],
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(
top: Radius.circular(12.r),

19
lib/modules/meeting/views/tabs/summary_tab.dart

@ -360,7 +360,7 @@ class _SummaryTabState extends State<SummaryTab> {
if (!_hasFocus)
Obx(
() => Positioned(
bottom: 20.w,
bottom: MediaQuery.of(context).padding.bottom + 20.w,
left: 0,
right: 0,
child: Row(
@ -481,13 +481,16 @@ class _SummaryTabState extends State<SummaryTab> {
bottom: 0,
left: -12.w,
right: -12.w,
child: Container(
height: 40,
color: isDarkMode ? Colors.grey[800] : Colors.white,
alignment: Alignment.center,
child: FleatherToolbar.basic(
controller: _fleatherController!,
editorKey: _editorKey,
child: SafeArea(
top: false,
child: Container(
height: 40,
color: isDarkMode ? Colors.grey[800] : Colors.white,
alignment: Alignment.center,
child: FleatherToolbar.basic(
controller: _fleatherController!,
editorKey: _editorKey,
),
),
),
),

37
lib/modules/payment/views/payment_view.dart

@ -32,23 +32,26 @@ class PaymentView extends GetView<PaymentController> {
onPressed: () => Get.back(),
),
),
body: SingleChildScrollView(
padding: EdgeInsets.all(16.w),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildTestInfoCard(isDarkMode),
SizedBox(height: 20.h),
_buildPaymentMethodSelector(isDarkMode),
SizedBox(height: 20.h),
_buildAmountSelector(isDarkMode),
SizedBox(height: 20.h),
_buildPaymentButton(isDarkMode),
SizedBox(height: 20.h),
_buildStatusCard(isDarkMode),
SizedBox(height: 20.h),
_buildInstructions(isDarkMode),
],
body: SafeArea(
top: false,
child: SingleChildScrollView(
padding: EdgeInsets.all(16.w),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildTestInfoCard(isDarkMode),
SizedBox(height: 20.h),
_buildPaymentMethodSelector(isDarkMode),
SizedBox(height: 20.h),
_buildAmountSelector(isDarkMode),
SizedBox(height: 20.h),
_buildPaymentButton(isDarkMode),
SizedBox(height: 20.h),
_buildStatusCard(isDarkMode),
SizedBox(height: 20.h),
_buildInstructions(isDarkMode),
],
),
),
),
);

27
lib/modules/permissions/views/permissions_view.dart

@ -38,19 +38,22 @@ class PermissionsView extends GetView<PermissionsController> {
),
centerTitle: true,
),
body: Obx(() {
if (controller.permissionStatuses.isEmpty) {
return const Center(child: CircularProgressIndicator());
}
body: SafeArea(
top: false,
child: Obx(() {
if (controller.permissionStatuses.isEmpty) {
return const Center(child: CircularProgressIndicator());
}
return RefreshIndicator(
onRefresh: controller.checkAllPermissions,
child: SingleChildScrollView(
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h),
child: _buildPermissionGroups(isDarkMode),
),
);
}),
return RefreshIndicator(
onRefresh: controller.checkAllPermissions,
child: SingleChildScrollView(
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h),
child: _buildPermissionGroups(isDarkMode),
),
);
}),
),
);
}

Loading…
Cancel
Save