Flutter 从无状态小部件调用状态完整小部件的设置状态

Flutter 从无状态小部件调用状态完整小部件的设置状态,flutter,widget,setstate,joystick,statefulwidget,Flutter,Widget,Setstate,Joystick,Statefulwidget,我有一个无状态widget类,它有一个需要跟踪其移动的widget。我无法将此小部件保存在有状态小部件中,因为我不希望刷新此小部件的状态 我有以下代码 import 'package:flutter/material.dart'; import 'package:control_pad/control_pad.dart'; void main() => runApp(new MyApp()); class MyApp extends StatelessWidget { @overr

我有一个无状态widget类,它有一个需要跟踪其移动的widget。我无法将此小部件保存在有状态小部件中,因为我不希望刷新此小部件的状态

我有以下代码

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

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

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      child: Column(
        children: <Widget>[
          Expanded(
            child: JoystickView(
              onDirectionChanged: (degree, direction) {
                //Change the state here.
              },
            ),
          ),
          Expanded(
            child: MyStateFull(),
          ),
        ],
      ),
    );
  }
}

class MyStateFull extends StatefulWidget {
  @override
  _MyStateFullState createState() => _MyStateFullState();
}

class _MyStateFullState extends State<MyStateFull> {
  double degree = 10;
  double direction = 10;

  //Call this from the stateless Widget
  void changedDirection(degree, direction) {
    setState(() {
      this.degree = degree;
      this.direction = direction;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text(
        "The degree Moved is $degree and the direction is $direction",
        style: TextStyle(fontSize: 25, color: Colors.black),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“包装:控制垫/控制垫.省道”;
void main()=>runApp(新的MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
主页:新建MyHomePage(),
);
}
}
类MyHomePage扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回容器(
颜色:颜色,白色,
子:列(
儿童:[
扩大(
孩子:乔伊斯蒂克维(
onDirectionChanged:(度、方向){
//改变这里的状态。
},
),
),
扩大(
子级:MyStateFull(),
),
],
),
);
}
}
类MyStateFull扩展StatefulWidget{
@凌驾
_MyStateFullState createState()=>\u MyStateFullState();
}
类_MyStateFullState扩展状态{
双度=10;
双向=10;
//从无状态小部件调用此函数
无效更改方向(度、方向){
设置状态(){
这个。度=度;
这个方向=方向;
});
}
@凌驾
小部件构建(构建上下文){
返回容器(
子:文本(
“移动的度数为$degree,方向为$direction”,
样式:TextStyle(字体大小:25,颜色:Colors.black),
),
);
}
}
此代码生成以下输出。

我希望方向和度值随着操纵杆的移动而改变


谢谢。

我自己试过,找到了解决办法。这可以使用流来完成。我将发布代码,以防将来有人需要它

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

class MyStateLess extends StatelessWidget {
  StreamController<List<double>> _controller = StreamController<List<double>>();

  GlobalKey<_MyStateFullState> statefulKey = new GlobalKey<_MyStateFullState>();

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        JoystickView(
          onDirectionChanged: (degree, direction) {
            List<double> temp = new List<double>();
            temp.add(degree);
            temp.add(direction);
            _controller.add(temp);
          },
        ),
        MyStateFull(stream: _controller.stream, key: statefulKey),
      ],
    );
  }
}

class MyStateFull extends StatefulWidget {
  final Stream<List<double>> stream;
  MyStateFull({Key key, @required this.stream}) : super(key: key);

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

class _MyStateFullState extends State<MyStateFull> {
  double _degree = 0.0;
  double _direction = 0.0;

  @override
  void initState() {
    super.initState();
    widget.stream.listen((event) {
      setState(() {
        _degree = event[0];
        _direction = event[1];
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text("$_degree, $_direction"),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“包装:控制垫/控制垫.省道”;
类MyStateLess扩展了无状态小部件{
StreamController _controller=StreamController();
GlobalKey statefulKey=新的GlobalKey();
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
乔伊斯蒂克维(
onDirectionChanged:(度、方向){
列表温度=新列表();
温度增加(度);
温度添加(方向);
_控制器。添加(温度);
},
),
MyStateFull(流:_controller.stream,key:statefulKey),
],
);
}
}
类MyStateFull扩展StatefulWidget{
最终河流;
MyStateFull({Key Key,@required this.stream}):超级(Key:Key);
@凌驾
_MyStateFullState createState()=>\u MyStateFullState();
}
类_MyStateFullState扩展状态{
双度=0.0;
双方向=0.0;
@凌驾
void initState(){
super.initState();
widget.stream.listen((事件){
设置状态(){
_度=事件[0];
_方向=事件[1];
});
});
}
@凌驾
小部件构建(构建上下文){
返回容器(
子项:文本($\u度,$\u方向”),
);
}
}