如何使用按键强制有状态小部件重绘?

TTR*_*TTR 2 mobile dart flutter

我正在制作一个从 API 提取数据并将其显示在视图中的应用程序(MVC 风格)。
我需要弄清楚如何强制我的视图小部件重新绘制自身。现在我尝试使用 ValueKeys 和 ObjectKeys 但没有成功。

有很多很多的代码,所以我将尽可能使用片段来保持清晰。(如果您需要查看更多代码,请随时询问)

这是我的视图小部件:

class view extends StatefulWidget{

  view({
    Key key,
    this.count = 0,
  }) : super(key: key);
  int count;
  String _action='';
  var _actionParams='';
  var _data;
  Function(String) callback;

  void setAction(String newAction){
    _action = newAction;
  }

  void setActionParams(String params){
    _actionParams = jsonDecode(params);
  }

  void setData(String data){
    _data = jsonDecode(data);
  }

  void incrementCounter(){
    count++;
  }

  @override
  _viewState createState() => _viewState();
}
class _viewState extends State<view>{
  Object redrawObject = Object();

  @override
  Widget build(BuildContext context) {
    /*
    switch(widget._action){
      case '':
        break;
      default:
        return null;
    }
    */
     return Text("Counter: "+widget.count.toString());
  }
  @override
  void initState(){
    this.redrawObject = widget.key;
    super.initState();
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以在注释的代码中看到,我计划更改视图根据传递给它的数据构建自身的方式。

到目前为止,我尝试的是将 ValueKey/ObjectKey 从构造函数中的 main.dart 传递到视图,然后在运行时更改对象。不幸的是这没有用。

在我的 main.dart 的顶部(可以从 main 中的任何地方访问)我有这个:

Object redraw = Object();
final dataView = new view(key: ObjectKey(redraw));
Run Code Online (Sandbox Code Playgroud)

然后在主页的正文中,我在下面有一个视图和一个浮动按钮。如果我按下按钮,它应该增加视图内的计数器并强制它重绘。这是我迄今为止尝试过的代码:

body: Center(
        child: dataView
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.badge),
        onPressed: (){
          dataView.incrementCounter();
          redraw = new Object();
        },
      ),
Run Code Online (Sandbox Code Playgroud)

据我了解,如果用作键的对象发生更改,那么 flutter 应该重建小部件的状态。所以我将我的对象设置为一个新对象,但它不起作用。

我也尝试过这样的事情:

onPressed: (){
          setState((){
            dataView.incrementCounter();
            redraw = new Object();
          });
        },
Run Code Online (Sandbox Code Playgroud)

最终我想将导航器与我的视图小部件结合使用(以便我们有一个后退按钮),但我不知道这是否可行。

感觉有点像我在和框架作斗争。我是否应该使用不同的范例(例如页面?)或者我可以这样做吗?

如何强制我的视图小部件重新绘制?

小智 5

您可以检查 flutter_phoenix的重绘效果逻辑。我认为它非常有用,或者你可以只使用包本身。基本上它会实现您想要实现的目标。

它在状态中创建一个唯一的键。

 Key _key = UniqueKey();
Run Code Online (Sandbox Code Playgroud)

将其注入到容器中。

@override
  Widget build(BuildContext context) {
    return Container(
      key: _key,
      child: widget.child,
    );
  }
Run Code Online (Sandbox Code Playgroud)

当你调用重生时,它只是刷新键,这会导致视图重建。

void restartApp() {
    setState(() {
      _key = UniqueKey();
    });
  }
Run Code Online (Sandbox Code Playgroud)