来自状态的颤动滑块值

时间:2020-09-02 18:04:25

标签: flutter build slider state

我是Flutter的新手,有两个问题。

我正在尝试通过设置Slider的初始值来使用State,我可以在构建后再获取。

但是我的问题是,每次移动Slider时,Builder都会从State设置相同的值,而Slider不会被更新,并且不动。

第二个问题类似于第一个问题。如您所见,在onChangeEnd()方法下,我在Slider中使用另一个BottomSheet,其终值为(从第一个Slider获取)。但是同样,我不能移动第二个Slider。我想原因是它在构建后也令人耳目一新。

如果您能说出解决方法并正确执行,那就太好了。

谢谢

class DetailPage extends StatefulWidget {
  @override
  _DetailPage State createState() => _DetailPage State();
}

class _DetailPage State extends State<DetailPage > {
  double _currentSliderValue;

  @override
  Widget build(BuildContext context) {
    return StoreConnector<AppState, AppState>(
        converter: (store) => store.state,
        builder: (context, state) {
          _currentSliderValue = state.progress.toDouble();
          return Scaffold(
            body: Container(
              child: Column(
                children: [
                  Row(
                    children: [
                      Expanded(
                        child: Slider(
                          value: _currentSliderValue,
                          min: 0,
                          max: 100,
                          divisions: 100,
                          label: _currentSliderValue.round().toString(),
                          onChanged: (double newValue) {
                            setState(() {
                              _currentSliderValue = newValue;
                            });
                          },
                          onChangeEnd: (double endValue) {
                            ModalHelper.showBottomModal(
                              context,
                              _currentSliderValue.toString() + " " + endValue.toString(),
                              Slider(
                                value: endValue,
                                min: 0,
                                max: 100,
                                divisions: 100,
                                label: endValue.round().toString(),
                                onChanged: (double newValue) {
                                  setState(() {
                                    endValue = newValue;
                                  });
                                },
                              ),
                            );
                          },
                        ),
                      ),
                    ],
                  ),
                ],
              ),
            ),
          );
        });
  }
}

解决方案:

第一个问题: 我在第一个滑块的设置状态上添加了简单标志,以便在重建后不重新设置_currentSliderValue值。

第二个问题: 使showBottomModal statefull解决了该问题。

1 个答案:

答案 0 :(得分:0)

我已经删除了bottomSheet并更改了代码,现在可以使用了。

import 'package:flutter/material.dart';

import 'arrow.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool loaded = false;
  double _currentSliderValue = 0;
  double _currentSliderValue2 = 0;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    Future.delayed(Duration(seconds: 3)).then((value) => {
          //Do more things
          setState(() {
            loaded = true;
          })
        });
  }

  ThemeData getTheme(BuildContext context) {
    // I wanna be able to call MediaQuery.of(contex) here
    return ThemeData();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
          visualDensity: VisualDensity.adaptivePlatformDensity,
        ),
        home: Scaffold(
          body: Container(
            child: Column(
              children: [
                Row(
                  children: [
                    Expanded(
                      child: Slider(
                        value: _currentSliderValue,
                        min: 0,
                        max: 100,
                        divisions: 100,
                        label: _currentSliderValue.round().toString(),
                        onChanged: (double newValue) {
                          setState(() {
                            _currentSliderValue = newValue;
                          });
                        },
                        onChangeEnd: (double endValue) {
                          setState(() {
                            _currentSliderValue2=endValue;
                          });
                        },
                      ),
                    ),
                    Expanded(
                      child: Slider(
                        value: _currentSliderValue2,
                        min: 0,
                        max: 100,
                        divisions: 100,
                        label: _currentSliderValue2.round().toString(),
                        onChanged: (double newValue) {
                          setState(() {
                            _currentSliderValue2 = newValue;
                          });
                        },

                      ),
                    ),
                  ],
                ),
              ],
            ),
          ),
        ));
  }


}