Flutter   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了dart – Flutter自定义范围滑块大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试在容器行上创建一个范围滑块,它应该创建一个音频波形,但我不知道从哪里开始…

主要问题是范围滑块位于容器行的顶部,它应该在“选定”部分更改颜色.

dart – Flutter自定义范围滑块

这是我现在拥有的:

dart – Flutter自定义范围滑块

用于创建图像和详细信息的代码.

class BeatLyricsPage extends StatefulWidget {
  final Beat beat;
  BeatLyricsPage(this.beat);

  @override
  _BeatLyricsPageState createState() => _BeatLyricsPageState(beat);
}

class _BeatLyricsPageState extends State<BeatLyricsPage> {
  final Beat beat;


  final _kPicHeight = 190.0;
  // used in _buildPageheading to add the beat key and beat bpm
  Widget _buildBeaTinfoItem(String text) => DecoratedBox(
        decoration: BoxDecoration(
          border: Border.all(color: MyColor.white,width: 1.0),borderRadius: BorderRadius.circular(4.0),),child: Padding(
          padding: EdgeInsets.symmetric(vertical: 3.0,horizontal: 12.0),child: Text(text,style: TextStyle(color: MyColor.white,fontSize: 10.0,fontWeight: FontWeight.w600)),);

  final _kAu@L_@R_772_11239@_8@ControlsWidth = 180.0;
  final _kAu@L_@R_772_11239@_8@ControlsHeight = 36.0;
  final _kAu@L_@R_772_11239@_8@ControlsmainButtonSize = 56.0;

  Widget _buildAu@L_@R_772_11239@_8@Controls(BuildContext context) => Positioned(
        left: (MediaQuery.of(context).size.width / 2) - (_kAu@L_@R_772_11239@_8@ControlsWidth / 2),top: _kPicHeight - (_kAu@L_@R_772_11239@_8@ControlsHeight / 2),child: Stack(
          overflow: Overflow.visible,children: [
            Container(
              width: _kAu@L_@R_772_11239@_8@ControlsWidth,height: _kAu@L_@R_772_11239@_8@ControlsHeight,decoration: BoxDecoration(color: MyColor.darkGrey,borderRadius: BorderRadius.circular(100.0)),padding: EdgeInsets.symmetric(horizontal: LayoutSpacing.sm),child: Row(
                children: [
                  CButtonLike(beatId: beat.id),Spacer(),GestureDetector(
                    behavior: HitTESTBehavior.opaque,child: Icon(BeatPulseIcons.cart),onTap: () => Navigator.push(context,MaterialPageRoute(builder: (_) => LicenSEOptionsPage(beat))),],// ****** MAIN BUTTON (Play/PausE) ******
            Positioned(
              left: (_kAu@L_@R_772_11239@_8@ControlsWidth / 2) - (_kAu@L_@R_772_11239@_8@ControlsmainButtonSize / 2),top: (_kAu@L_@R_772_11239@_8@ControlsHeight - _kAu@L_@R_772_11239@_8@ControlsmainButtonSizE) / 2,child: Container(
                height: _kAu@L_@R_772_11239@_8@ControlsmainButtonSize,width: _kAu@L_@R_772_11239@_8@ControlsmainButtonSize,decoration: BoxDecoration(
                    gradient: LinearGradient(begin: Alignment.topLeft,colors: [MyColor.priMary,Color(0xFFf80d0a)]),child: CButtonPlay(),)
          ],);

  Widget _buildWaveForm() {
    // creates a random list of doubles,"fake data"
    var rng = Random();
    final List waveFormData = [];
    for (var i = 0; i < 90; i++) {
      waveFormData.add(rng.nexTint(45).toDouble());
    }
    // player bloc
    final playerBloc = BlocProvider.getPlayerBloc(context);
    // renders
    return Container(
      height: _kPicHeight,padding: EdgeInsets.symmetric(vertical: LayoutSpacing.xxxl),child: Row(
        mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.end,children: [
          // current playing second
          StreamBuilder<double>(
            stream: playerBloc.playingSecond,initialData: 0.0,builder: (_,playingSecondSnapshot) {
              // current beat playing
              return StreamBuilder<Beat>(
                stream: playerBloc.playingBeat,playingBeatSnapshot) {
                  final playingBeat = playingBeatSnapshot.data;
                  // if the beat playing is the same as the beat SELEcted for the lyrics,show playing seconds
                  if (playingBeat?.id == beat.id)
                    return Text(secondsToTime(playingSecondSnapshot.data),style: MyFontStyle.sizeXxs);
                  // otherwise show 0:00
                  else
                    return Text(secondsToTime(0),style: MyFontStyle.sizeXxs);
                },);
            },SizedBox(width: LayoutSpacing.xs),Row(
            mainAxisAlignment: MainAxisAlignment.center,children: waveFormData
                .map((waveFormDataIndeX) => Container(
                      height: waveFormDataIndex > 5.0 ? waveFormDataIndex : 5.0,width: 2,color: MyColor.white,margin: EdgeInsets.only(right: 1),))
                .toList(),Text(secondsToTime(beat.length),style: MyFontStyle.sizeXxs),);
  }

  Widget _buildPageheading(BuildContext context,{@@L_262_27@ String imageUrl}) => Stack(
        children: [
          column(
            children: [
              Hero(
                tag: MyKeys.makePlayerCoverKey(beat.id),child: Opacity(
                  opacity: 0.3,child: Container(
                    height: _kPicHeight,decoration: BoxDecoration(
                      image: DecorationImage(image: CachedNetworkImageProvider(imageUrl),fit: BoxFit.cover),Container(color: MyColor.BACkground,height: LayoutSpacing.xl)
            ],Padding(
            padding: EdgeInsets.all(LayoutSpacing.xs),child: Row(
              mainAxisAlignment: MainAxisAlignment.end,children: [
                _buildBeaTinfoItem(beat.key),SizedBox(width: 4.0),_buildBeaTinfoItem('${Beat.bpm} BPM'),_buildAu@L_@R_772_11239@_8@Controls(context),_buildWaveForm(),);
}

解决方法

要创建自定义范围滑块,您可以使用 GestureRecognizer并将每个滑块的位置保存在 StatefulWidget内的变量中.要确定索引为i的条在范围内,您可以划分限制器的像素位置(bar1& amp) ;在下面的源中的bar2)通过条的宽度并将其与i进行比较.

可悲的是,我无法使用您的代码示例.相反,我创建了一个最基本的示例,如下所示.如果您花一点时间阅读,我相信您可以将其转移到您的应用程序.

dart – Flutter自定义范围滑块

import 'dart:math';

import 'package:Flutter/material.dart';

List<int> bars = [];

void main() {
  // generate random bars
  Random r = Random();
  for (var i = 0; i < 50; i++) {
    bars.add(r.nexTint(200));
  }

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Home(),);
  }
}

class Home extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => HomeState();
}

class HomeState extends State<Home> {
  static const barWidth = 5.0;
  double bar1Position = 60.0;
  double bar2Position = 180.0;

  @override
  Widget build(BuildContext context) {
    int i = 0;

    return Scaffold(
      body: Center(
        child: Stack(
          alignment: Alignment.centerLeft,children: <Widget>[
            Row(
              crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.start,children: bars.map((int height) {
                Color color =
                    i >= bar1Position / barWidth && i <= bar2Position / barWidth
                        ? Colors.deepPurple
                        : Colors.blueGrey;
                i++;

                return Container(
                  color: color,height: height.toDouble(),width: 5.0,);
              }).toList(),Bar(
              position: bar2Position,callBACk: (DragupdateDetails details) {
                setState(() {
                  bar2Position += details.delta.dx;
                });
              },Bar(
              position: bar1Position,callBACk: (DragupdateDetails details) {
                setState(() {
                  bar1Position += details.delta.dx;
                });
              },);
  }
}

class Bar extends StatelessWidget {
  final double position;
  final GestureDragupdateCallBACk callBACk;

  Bar({this.position,this.callBACk});

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.only(left: position >= 0.0 ? position : 0.0),child: GestureDetector(
        onHorizontalDragupdate: callBACk,child: Container(
          color: Colors.red,height: 200.0,);
  }
}

大佬总结

以上是大佬教程为你收集整理的dart – Flutter自定义范围滑块全部内容,希望文章能够帮你解决dart – Flutter自定义范围滑块所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。