【问题标题】:How to change the offset value of ScrollController between widgets in Flutter?Flutter 中如何改变 ScrollController 的偏移值?
【发布时间】:2020-02-23 22:19:18
【问题描述】:

我正在尝试从另一个有状态小部件更改驻留在一个有状态小部件中的 ScrollController 的偏移值。

我没有使用导航器来更改屏幕,而是简单地调用有状态小部件。

在这种情况下,InspectionForm 有状态小部件在 HomeScreen 有状态小部件内被调用。

主屏幕有状态小部件:

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();

class _HomeScreenState extends State<HomeScreen> {

final ScrollController _homeController = ScrollController();

Widget _buildForm() {
    if (_homeController.hasClients) {
      setState(() {
        _homeController.animateTo(
          0.0,
          curve: Curves.easeOut,
          duration: const Duration(milliseconds: 300),
        );
      });
    }

return InspectionForm();

}

@override
  Widget build(BuildContext context) {
return Scaffold(body: CustomScrollView(
              controller: _homeController,
              primary: false,
              slivers: <Widget>[
                SliverList(
                  delegate: SliverChildListDelegate(
                    [
                      Column(
                        children: <Widget>[
                          Container(
                            child: _buildForm(),
                          ),
                        ],
                      ),
                    ],
                  ),
                ),
              ],
            ),
          );
} 

表单有状态小部件:

class InspectionForm extends StatefulWidget {

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

class _InspectionFormState extends State<InspectionForm> {

@override
  Widget build(BuildContext context) {
return RaisedButton(
onPressed: (){

//Need to change the ScrollView offset when this button is pressed over here.


}

);
}

}

我已经简化了上面的代码,使其更易于阅读,并简单地理解我正在尝试做的事情。任何帮助将不胜感激。

【问题讨论】:

    标签: flutter


    【解决方案1】:

    在我看来,您已经知道 Flutter 的 ScrollControllers 是如何工作的,并且您的 InspectionForm 被实例化为您的 HomeScreen 的子代,所以您可以做的一件事是从您的 @987654324 传递一个函数@ 以InspectionForm 作为参数。这个函数会从InspectionForm 触发,但它会在HomeScreen 中定义,你可以在ScrollController 中做任何你想做的事情。类似这样的东西(我没有尝试过这段代码,它只是一个草稿,供你理解)。

    class HomeScreen extends StatefulWidget {
    @override
    _HomeScreenState createState() => _HomeScreenState();
    
    class _HomeScreenState extends State<HomeScreen> {
    
    final ScrollController _homeController = ScrollController();
    
    Widget _buildForm(void Function(double) onFormButtonPressed) {
    if (_homeController.hasClients) {
      setState(() {
        _homeController.animateTo(
          0.0,
          curve: Curves.easeOut,
          duration: const Duration(milliseconds: 300),
        );
      });
    }
    
    return InspectionForm(onFormButtonPressed);
    }
    
    void _onFormButtonPressed(double scrollOffset) {
      // Whatever you need to do with the ScrollController here...
    }
    
    @override
    Widget build(BuildContext context) {
    return Scaffold(body: CustomScrollView(
              controller: _homeController,
              primary: false,
              slivers: <Widget>[
                SliverList(
                  delegate: SliverChildListDelegate(
                    [
                      Column(
                        children: <Widget>[
                          Container(
                            child: _buildForm(_onFormButtonPressed),
                          ),
                        ],
                      ),
                    ],
                  ),
                ),
              ],
            ),
          );
    }
    

    那么,你的Form需要把函数作为参数。

    class InspectionForm extends StatefulWidget {
    InspectionForm(this.onButtonPressed);
    
    final void Function(double) onButtonPressed;
    
    @override
    _InspectionFormState createState() => _InspectionFormState();
    }
    
    class _InspectionFormState extends State<InspectionForm> {
    
    @override
    Widget build(BuildContext context) {
      return RaisedButton(
       onPressed: () { 
        // Compute some scrollOffset here, whatever you need...
        widget.onButtonPressed(scrollOffset); 
       }
      );
     }
    }
    

    【讨论】:

    • 这就是我的想法,但由于我是 Flutter 的新手,我认为必须有更好的方法来实现这一点!谢谢你的帮助!!
    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 2019-05-16
    • 2020-06-03
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多