• 侧边栏Drawer栏刷新


    Drawer的父类为StatelessWidget,不可刷新,今天来讲一下刷新的办法
    需求:点击A用户,弹出侧边栏,侧边栏展示用户的数据。
    需要使用StreamBuilder。但是使用stream发数据是行不通的,因为数据传递不进去。
    但是使用StreamBuilder依旧可以收到通知。所以流程就需要改变一下
    一、点击按键后刷新Drawer并展示
    1、使用StatefulWidget
    2、在state里创建备用数据,本例为SSML ssml=SSML();
    3、点击按键,更新备用数据:ssml = ssmlList[index];
    4、通知StreamBuilder:streamController.add(‘event’);
    5、StreamBuilder接到通知,使用备用数据重新构造

    二、刷新Drawer面板上的内容
    具体为使用StatefulBuilder自带的setState方法,不要使用公共的,作为区别,名字改为setStateB。代码片段为_changeRate方法

    class DrawerTest extends StatefulWidget {
      final File file;
    
      const DrawerTest(this.file, {super.key});
    
      @override
      State createState() {
        return _DrawerTestState();
      }
    }
    
    class _DrawerTestState extends State {
      SSML ssml = SSML();
      StreamController streamController = StreamController.broadcast();
      List ssmlList = [];
    
      @override
      void initState() {
        ssmlList.add(SSML()..name = 'dan');
        ssmlList.add(SSML()..name = 'ada');
        super.initState();
      }
    
      final GlobalKey _ssKey = GlobalKey();
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            key: _ssKey,
            drawer: _getDrawer(),
            appBar: AppBar(
              leading: IconButton(
                  onPressed: () {
                    Navigator.pop(context);
                  },
                  icon: const Icon(Icons.arrow_back)),
              title: const Text('Drawer测试'),
            ),
            body: SafeArea(
                child: Container(
              color: Colors.white10,
              padding: const EdgeInsets.all(15),
              child: ListView.builder(
                  itemCount: ssmlList.length,
                  itemBuilder: (context, index) {
                    return ElevatedButton(
                        onPressed: () {
                          ssml = ssmlList[index];
                          streamController.add('event'); //通知StreamBuilder该刷新了
                          _ssKey.currentState!.openDrawer();
                        },
                        child: Text('${ssmlList[index].name}打开左边栏'));
                  }),
            )));
      }
    
      StreamBuilder _getDrawer() {
        return StreamBuilder(
            stream: streamController.stream,
            builder: (context, shot) {
              return Drawer(child: StatefulBuilder(
                builder: (context, setStateB) {
                  return _changeRate(ssml);
                },
              ));
            });
      }
    
      Widget _changeRate(SSML ssml) {
        return StatefulBuilder(builder: (context, setStateB) {
          return Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              Text('速度:${ssml.rate}'),
              Slider(
                  value: ssml.rate.toDouble(),
                  max: 500,
                  min: -500,
                  onChanged: (value) {
                    setStateB(() {
                      ssml.rate = value.toInt();
                    });
                    // setState(() {});
                  })
            ],
          );
        });
      }
    }
    
    class SSML {
      late String name;
      int rate = 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
  • 相关阅读:
    第8章 - 异构系统的协同控制及最优控制 --> 协同控制
    【Jmeter】提取和引用Token
    sql 14
    docker入门加实战—部署Java和前端项目
    [每日两题系列]刷算法题咯~~
    基于贝叶斯分类器和线性分类器的手写数字识别 - MATLAB仿真
    为什么不建议使用Python自带的logging?
    基于javaweb的酒店客房预订管理系统
    从源码角度分析Mybatis级联映射的实现原理
    SSM(Spring SpringMVC MyBatis)配置文件信息,完成学生管理页面(前后端全部代码)
  • 原文地址:https://blog.csdn.net/weixin_43689053/article/details/128208182