flutter 嵌套 StatefulWidget 不刷新

widget1 中有一个按钮和 widget2 ,

点击一次按钮 数字i+1,调用 widget2(i); widget1 widget2 都是 StatefulWidget 

import 'package:flutter/material.dart';
import 'package:stack_trace/stack_trace.dart';
import 'dart:developer' as dev;

void main() {
  runApp(MaterialApp(title: 'Dict', home: Scaffold(body: widget1())));
}

class widget1 extends StatefulWidget {
  @override
  State<widget1> createState() => widget1_();
}

class widget1_ extends State<widget1> {
  int i=1;

  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        ElevatedButton(
          child: Text("normal"),
          onPressed: () {
            setState(() {
              i=i+1;
            });
          },
        ),
        widget2(i)
      ],
    );
  }
}


class widget2 extends StatefulWidget {
  int i;
  widget2(this.i) {
    //这一行能够收到变化
    debug(i.toString());
  }
  @override
  State<widget2> createState() => widget2_(i);
}

class widget2_ extends State<widget2> {
  int i;
  widget2_(this.i) {
    //这里不会变化 甚至变化的时候都不会重新执行这里的代码
    debug(i.toString());
  }
  @override
  Widget build(BuildContext context) {
    return Text(i.toString());
  }
}
debug(Object? object,[int i=1]) {
  if(i>0){
    //获取 调用当前程序 所在 的文件 以及具体的行
    //将 StackTrace 对象转换成 Chain 对象
    //toTrace().frames // 拿出其中一条信息
    //[1] 上一层
    var frame = Chain.current().toTrace().frames[i];
    print("file :${frame.uri} line ${frame.line}");
  }
  var str = object.toString();
  if(str.length>450){
    dev.log(str);
  }
  print(object);
}

1.传递一个UniqueKey()可以解决 让它强制刷新,

2.或者使用 ValueKey(),

3.GlobalKey bKey = GlobalKey();textKey.currentState.onPressed(_count); 这个方案测试无效

import 'package:flutter/material.dart';
import 'package:stack_trace/stack_trace.dart';
import 'dart:developer' as dev;

void main() {
  runApp(MaterialApp(title: 'Dict', home: Scaffold(body: widget1())));
}

class widget1 extends StatefulWidget {
  @override
  State<widget1> createState() => widget1_();
}

class widget1_ extends State<widget1> {
  int i=1;

  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        ElevatedButton(
          child: Text("normal"),
          onPressed: () {
            setState(() {
              i=i+1;
            });
          },
        ),
        widget2(i,ValueKey(i))
      ],
    );
  }
}


class widget2 extends StatefulWidget {
  int i;
  Key key;
  widget2(this.i,this.key) {
    //这一行能够收到变化
    debug(i.toString());
  }
  @override
  State<widget2> createState() => widget2_(i);
}

class widget2_ extends State<widget2> {
  int i;
  widget2_(this.i) {
    //这里不会变化 甚至变化的时候都不会重新执行这里的代码
    debug(i.toString());
  }
  @override
  Widget build(BuildContext context) {
    return Text(i.toString());
  }
}
debug(Object? object,[int i=1]) {
  if(i>0){
    //获取 调用当前程序 所在 的文件 以及具体的行
    //将 StackTrace 对象转换成 Chain 对象
    //toTrace().frames // 拿出其中一条信息
    //[1] 上一层
    var frame = Chain.current().toTrace().frames[i];
    print("file :${frame.uri} line ${frame.line}");
  }
  var str = object.toString();
  if(str.length>450){
    dev.log(str);
  }
  print(object);
}

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-05-16 11:52:07       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-16 11:52:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-16 11:52:07       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-16 11:52:07       20 阅读

热门阅读

  1. logstach+elasticsearch+kibana整合后台.log文件

    2024-05-16 11:52:07       10 阅读
  2. 解密 Unix 中的 “rc“ 后缀:自定义你的工作环境

    2024-05-16 11:52:07       10 阅读
  3. oracle 临时表 在sql 里面用完要删除吗

    2024-05-16 11:52:07       11 阅读
  4. 简单上手SpringBean的整个装配过程

    2024-05-16 11:52:07       13 阅读
  5. Oracle 数据块之变化时的SCN

    2024-05-16 11:52:07       12 阅读
  6. bert 的MLM框架任务-梯度累积

    2024-05-16 11:52:07       14 阅读