Заголовок панели приложений Flutter перекрывается с анимированным индикатором выполнения

#android #flutter #dart

#Android #flutter #dart

Вопрос:

Я пытался создать панель приложений с двухстрочным заголовком и анимированным индикатором выполнения под ним, вот так: Ожидаемая панель приложений

Я хотел выровнять основной заголовок со стрелкой навигации, поэтому я использую отступы с заголовком, но анимированный индикатор выполнения перекрывается с моим текстом: Фактический результат

Могу ли я как-нибудь это исправить?

sign_video.dart*

 Widget build(BuildContext context) {
    return FutureBuilder(
      future: _initializeVideoPlayerFuture,
      builder: (context, snapshot) {
        // if (snapshot.connectionState == ConnectionState.done amp;amp; isReady) {
        return Scaffold(
          backgroundColor: Colors.white,
          appBar: AppBar(
            iconTheme: IconThemeData(
              color: Colors.black, //change your color here
            ),
            backgroundColor: Colors.white,
            elevation: 0,
            title: Padding(
              padding: const EdgeInsets.only(
                top: 30.0,
                bottom: 30.0,
              ),
              child: SafeArea(
                child: RichText(
                  text: TextSpan(
                      text: vidlist[currentIndexPosition].category,
                      style: kTitleTextStyle.copyWith(fontSize: 21),
                      children: [
                        TextSpan(text: "n"),
                        TextSpan(
                          text: '${vidlist.length.toString()} words',
                          style: TextStyle(
                            fontSize: 18.0,
                            color: Color(0xFF505050),
                          ),
                        ),
                      ]),
                ),
              ),
            ),
            bottom: AnimatedProgressBar(
                height: 10.0,
                value: (currentIndexPosition   1) / vidlist.length),
          ),
          body: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            children: [
              Expanded(
                child: Container(
                  margin: EdgeInsets.only(top: 27.0),
                  width: double.infinity,
                  decoration: BoxDecoration(
                    color: Color(0xFFF1F3F6),
                    borderRadius: BorderRadius.only(
                      topLeft: Radius.circular(20),
                      topRight: Radius.circular(20),
                    ),
                  ),
                  child: Column(
                    children: [
                      SizedBox(
                        height: 15.0,
                      ),
                      Text(
                        vidlist[currentIndexPosition].signName,
                        style: TextStyle(
                          fontSize: 50,
                          color: Color(0xFF505050),
                          fontWeight: FontWeight.w800,
                        ),
                      ),
                      SizedBox(
                        height: 30.0,
                      ),
                      snapshot.connectionState == ConnectionState.done amp;amp;
                              isReady
                          ? Padding(
                              padding: const EdgeInsets.only(
                                  top: 8.0, left: 16.0, right: 16.0),
                              child: ClipRRect(
                                borderRadius: BorderRadius.circular(20),
                                child: AspectRatio(
                                  aspectRatio: _controller.value.aspectRatio,
                                  // Use the VideoPlayer widget to display the video.
                                  child: VideoPlayer(_controller),
                                ),
                              ),
                            )
                          : Container(
                              height: 221.0,
                              width: 221.0,
                              child: CircularProgressIndicator(),
                            ),
                      SizedBox(
                        height: 125.0,
                      ),
                      Row(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: [
                          RawMaterialButton(
                            onPressed: () {
                              setState(() {
                                if (currentIndexPosition <= 0) {
                                  currentIndexPosition = vidlist.length - 1;
                                } else {
                                  currentIndexPosition--;
                                }
                                _startPlay();
                              });
                            },
                            elevation: 5.0,
                            fillColor: Colors.white,
                            child: Icon(
                              FontAwesomeIcons.chevronLeft,
                              size: 25.0,
                            ),
                            padding: EdgeInsets.all(20.0),
                            shape: CircleBorder(),
                          ),
                          // RawMaterialButton(
                          //   onPressed: () {
                          //     Navigator.push(
                          //       context,
                          //       MaterialPageRoute(
                          //         builder: (context) => SignChecker(
                          //           category:
                          //               vidlist[currentIndexPosition].category,
                          //           sign:
                          //               vidlist[currentIndexPosition].signName,
                          //         ),
                          //       ),
                          //     );
                          //   },
                          //   elevation: 5.0,
                          //   fillColor: kDarkBlueColor,
                          //   child: Icon(
                          //     FontAwesomeIcons.camera,
                          //     size: 25.0,
                          //     color: Colors.white,
                          //   ),
                          //   padding: EdgeInsets.all(20.0),
                          //   shape: CircleBorder(),
                          // ),
                          RawMaterialButton(
                            onPressed: () {
                              setState(() {
                                if (currentIndexPosition <= 0) {
                                  currentIndexPosition = vidlist.length - 1;
                                } else {
                                  currentIndexPosition--;
                                }
                                _startPlay();
                              });
                            },
                            elevation: 5.0,
                            fillColor: Colors.white,
                            child: Icon(
                              FontAwesomeIcons.chevronRight,
                              size: 25.0,
                            ),
                            padding: EdgeInsets.all(20.0),
                            shape: CircleBorder(),
                          )
                        ],
                      ),
                    ],
                  ),
                ),
              ),
            ],
          ),
        );
      },
    );
  }
  

progress_bar.dart

 import 'package:flutter/material.dart';

class AnimatedProgressBar extends StatefulWidget
    implements PreferredSizeWidget {
  final double value;
  final double height;
  @override
  Size preferredSize;
  // AnimatedProgressBar({@required this.value, this.height = 12});

  AnimatedProgressBar({this.height, this.value});

  @override
  _AnimatedProgressBarState createState() => _AnimatedProgressBarState();
}

class _AnimatedProgressBarState extends State<AnimatedProgressBar> {
  @override
  Widget build(BuildContext context) {
    return LayoutBuilder(
      builder: (BuildContext context, BoxConstraints box) {
        // using padding will cut the progress bar
        // -145 to make the bar align with the appBar title
        widget.preferredSize =
            Size.fromWidth(box.maxWidth * _floor(widget.value - 145));
        return Container(
          width: box.maxWidth - 145,
          child: Stack(
            children: [
              Container(
                height: widget.height,
                decoration: BoxDecoration(
                  color: Color(0XFFF1F3F6),
                  borderRadius: BorderRadius.all(
                    Radius.circular(widget.height),
                  ),
                ),
              ),
              AnimatedContainer(
                duration: Duration(milliseconds: 800),
                curve: Curves.easeOutCubic,
                height: widget.height,
                width: (box.maxWidth - 145) * _floor(widget.value),
                decoration: BoxDecoration(
                  color: Color(0xFF0132C7),
                  borderRadius: BorderRadius.all(
                    Radius.circular(widget.height),
                  ),
                ),
              ),
            ],
          ),
        );
      },
    );
  }

  _floor(double value, [min = 0.0]) {
    return value.sign <= min ? min : value;
  }
}
  

Ответ №1:

Я думаю, что это перекрывается из-за ограниченного пространства в панели приложений.Укажите пользовательскую высоту в панели приложений, надеюсь, это сработает.

 class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Your title',
      home: Scaffold(
        appBar: PreferredSize(
          preferredSize: Size.fromHeight(100.0), // here the desired height
          child: AppBar(
            // ...
          )
        ),
        body: // ...
      )
    );
  }
}