首页 > 解决方案 > 如何在 Flutter 中正确绑定有状态小部件中的回调函数?

问题描述

我是 Flutter 开发的新手,

问题是:在我的函数中调用该方法时, Controlpad无法正常工作。setState()

我正在使用ControlPad GitHub

我的依赖: control_pad:^1.0.0+2

当我注释掉这一setState()行时,ControlPad 工作正常,但小部件没有更新,否则 ControlPad 工作不正常。

概括:

我想将_move方法与onDirectionChanged函数绑定

import 'package:flutter/material.dart';
import 'package:control_pad/control_pad.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.lightBlue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title, this.test}) : super(key: key);

  final String title;
  final String test;

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

class _MyHomePageState extends State<MyHomePage> {

  double _x= 50;
  double _y= 50;

  void _move(double _degrees, double _distance) {    
    print('Degree:'+_degrees.toString()+' Distance:'+_distance.toString());
    //setState(() {      
      _x += 1;
      _y += 1;
    //});    
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: null,
      body: Container(
        child: Stack(
                children: <Widget>[            
                  Container(   //FullScreen
                    width: MediaQuery.of(context).size.width,
                    height: MediaQuery.of(context).size.height,
                    color: Colors.grey,                    
                  ),      
                  Positioned(
                    bottom: _x ,
                    left: _y,
                    height: 50,      
                    width: 50,              
                    child: Container(
                        color: Colors.purple,
                        child: null,
                      ),
                  ),
                  Positioned(                    
                    bottom: 10 ,
                    left: 10,                      
                    child: JoystickView(                                            
                      opacity: 0.9, 
                      size: MediaQuery.of(context).size.width/4, 
                      showArrows: false, 
                      onDirectionChanged: (double degrees, double distance)=> _move(degrees,distance),
                      ),
                  ),
                ],
              )                        
      ),
    );
  }
}

我不知道这段代码有什么问题。任何帮助都是有价值的。

标签: flutterdart

解决方案


将您的构造函数修改为:

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title, this.test, this.onTap}) : super(key: key);

  final String title;
  final String test;
  VoidCallback onTap;

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

然后这样称呼它:

MyHomePage(
   title: '',
   'test': '',
   (){}
);

我的回答是基于你的标题,看来你在问题细节中寻找不同的东西


推荐阅读