I am trying to achieve the design for the bottom navigation bar attached to this message in flutter but it is really stressing me out. I have tried different packages and solutions but i haven't made any progress yet. If anyone can be of help, i will be very delighted. enter image description here

推荐答案

我找不到任何完全预先准备好的解决方案来解决这个问题,但有一个包提供了一个很好的起点:https://pub.dev/packages/convex_bottom_bar

安装后,您将需要编辑程序包中的...\src\convex_shape.dart,因为默认情况下,RADIUS选项仅适用于左上角和右上角.

在上面的文件中,更改为

return radius > 0
    ? (Path()
      ..moveTo(host.left, host.top + radius)
      ..arcToPoint(Offset(host.left + radius, host.top), radius: Radius.circular(radius))
      ..lineTo(p[0].dx, p[0].dy)
      ..quadraticBezierTo(p[1].dx, p[1].dy, p[2].dx, p[2].dy)
      ..arcToPoint(
        p[3],
        radius: Radius.circular(notchRadius + 10),
        clockwise: true,
      )
      ..quadraticBezierTo(p[4].dx, p[4].dy, p[5].dx, p[5].dy)
      ..lineTo(host.right - radius, host.top)
      ..arcToPoint(Offset(host.right, host.top + radius), radius: Radius.circular(radius))
      ..lineTo(host.right, host.bottom - radius)
      ..arcToPoint(Offset(host.right - radius, host.bottom), radius: Radius.circular(radius))
      ..lineTo(host.left + radius, host.bottom)
      ..arcToPoint(Offset(host.left, host.bottom - radius), radius: Radius.circular(radius))
      ..close())
    : (Path()
      ..moveTo(host.left, host.top)
      ..lineTo(p[0].dx, p[0].dy)
      ..quadraticBezierTo(p[1].dx, p[1].dy, p[2].dx, p[2].dy)
      ..arcToPoint(
        p[3],
        radius: Radius.circular(notchRadius + 10),
        clockwise: true,
      )
      ..quadraticBezierTo(p[4].dx, p[4].dy, p[5].dx, p[5].dy)
      ..lineTo(host.right, host.top)
      ..lineTo(host.right, host.bottom)
      ..lineTo(host.left, host.bottom)
      ..close());

从这个开始

    return radius > 0
    ? (Path()
      ..moveTo(host.left, host.top + radius)
      ..arcToPoint(Offset(host.left + radius, host.top), radius: Radius.circular(radius))
      ..lineTo(p[0].dx, p[0].dy)
      ..quadraticBezierTo(p[1].dx, p[1].dy, p[2].dx, p[2].dy)
      ..arcToPoint(
        p[3],
        radius: Radius.circular(notchRadius),
        clockwise: true,
      )
      ..quadraticBezierTo(p[4].dx, p[4].dy, p[5].dx, p[5].dy)
      ..lineTo(host.right - radius, host.top)
      ..arcToPoint(Offset(host.right, host.top + radius), radius: Radius.circular(radius))
      ..lineTo(host.right, host.bottom)
      ..lineTo(host.left, host.bottom)
      ..close())
    : (Path()
      ..moveTo(host.left, host.top)
      ..lineTo(p[0].dx, p[0].dy)
      ..quadraticBezierTo(p[1].dx, p[1].dy, p[2].dx, p[2].dy)
      ..arcToPoint(
        p[3],
        radius: Radius.circular(notchRadius),
        clockwise: true,
      )
      ..quadraticBezierTo(p[4].dx, p[4].dy, p[5].dx, p[5].dy)
      ..lineTo(host.right, host.top)
      ..lineTo(host.right, host.bottom)
      ..lineTo(host.left, host.bottom)
      ..close());

之后,只需提供填充、高程和BorderRadius即可根据您的喜好进行定制

import 'package:convex_bottom_bar/convex_bottom_bar.dart';
import 'package:flutter/material.dart';

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'Custom  bottom nav bar',
            ),
          ],
        ),
      ),
      bottomNavigationBar: Container(
        padding: const EdgeInsets.all(24.0),
        child: ConvexAppBar(
          elevation: 5,
          height: 80,
          cornerRadius: 12,
          style: TabStyle.fixedCircle,
          items: const [
            TabItem(icon: Icons.home, title: 'Home'),
            TabItem(icon: Icons.map, title: 'Discovery'),
            TabItem(icon: Icons.add, title: 'Add'),
            TabItem(icon: Icons.message, title: 'Message'),
            TabItem(icon: Icons.people, title: 'Profile'),
          ],
        ),
      ),
    );
  }
}

Here is the result of the above page

Ios相关问答推荐

PieChartView未以编程方式显示在屏幕上

彩色进度线--SWIFT

SwiftUI拖动手势和内容拖动时的奇怪行为( skip /卡顿)

在某些情况下,UIHostingController在自动调整时不能调整大小

设置托管在DigitalOcean上的iOS通用链接

使用 WebKit 加载 YouTube 视频时控制台中打印警告

具有一个参数/参数的泛型类的泛型类

为什么常量属性可能在 Swift 类中被初始化两次?

CoreML 不能并发(多线程)工作?

SwiftUI 切换语句

禁用 UITextField 的自动更正

在iOS7半透明导航栏中获取正确的 colored颜色

SwiftUI 视图 - viewDidLoad()?

通过touch 传递到下面的 UIViews

在 Grand Central Dispatch 中使用 dispatch_sync

在 Swift 中上传带参数的图像

Xcode 8:函数类型不能有参数标签 destruct 我的构建

在滚动视图中使用动态大小的控制器调整容器视图的大小

为给定的 UIColor 获取更亮和更暗的 colored颜色 变化

如何检测快速touch 或单击的tableView单元格