Flutter 颤振-根据用户文本输入从API中刷新列表的位置

Flutter 颤振-根据用户文本输入从API中刷新列表的位置,flutter,dart,Flutter,Dart,正在尝试创建“按用户类型筛选”列表 我有一个“父”窗口小部件(屏幕),它有一个 文本字段和 “自定义小部件”类定义在一个单独的文件中[由State对象和StatefulWidget]组成],该类基本上使用FutureBuilder调用API,并使用结果构建列表视图。当屏幕第一次启动时,“自定义小部件”使用initState()进行FutureBuilder依赖的异步调用。这是完美的工作,并显示未过滤的列表 最后,我想使用“父”小部件中的文本字段来过滤来自自定义小部件中API的结果。因此,我需要一

正在尝试创建“按用户类型筛选”列表

我有一个“父”窗口小部件(屏幕),它有一个

  • 文本字段和
  • “自定义小部件”类定义在一个单独的文件中[由
    State
    对象和
    StatefulWidget
    ]组成],该类基本上使用
    FutureBuilder
    调用API,并使用结果构建列表视图。当屏幕第一次启动时,“自定义小部件”使用
    initState()
    进行FutureBuilder依赖的异步调用。这是完美的工作,并显示未过滤的列表
  • 最后,我想使用“父”小部件中的文本字段来过滤来自自定义小部件中API的结果。因此,我需要一种方法,让自定义小部件“接收”或“检测”文本字段的值,然后将该值作为
    GET
    参数包含到API中(用于服务器端的过滤)。我可以让它在文本字段作为参数传递给自定义小部件并且状态对象可以访问的地方工作(通过
    widget.fieldName

    问题是
    initState()
    只被调用一次。因此,我不能使用它在用户类型时对API进行额外调用。我知道每次文本字段更改时都会调用
    build()
    (因为它是statefulwidget的一个参数)。但是,我不能使用
    build()
    调用异步函数,因为build()必须返回一个小部件。调用异步函数然后返回空白/占位符小部件不是一个选项,因为列表最初是预先填充的(在
    initState()
    中),没有过滤器,所以我不希望在API刷新时列表消失。另外,我不认为这就是
    build()
    的目的(它应该是“纯”的,我认为它是愚蠢的,只是反映了其他地方处理的状态管理的结果)

    我一直在寻找一种“介于”
    initState()
    build()
    之间的东西,这种东西每次都会被调用,但实际上并不像
    build()
    那样是绘制UI的一部分。我知道didChangeDependencies(),但没有人打电话给我。似乎我必须设置一些我不熟悉的
    “继承小部件”
    系统

    有什么想法可以实现我想要的吗?我想理论上我可以将文本字段移动到“custom widget”类中,看看是否可以使用两者中更接近的范围来相互影响(例如,我可以使用文本字段的
    onChanged()
    直接调用FutureBuilder依赖的异步函数(因为它们在同一个类中,所以它可以访问它)但是,我希望将它们分开,因为将来可能会有很多东西需要/想要传递给自定义小部件进行过滤(GPS位置/其他首选项),并且尝试将所有内容都包含在自定义小部件类中似乎很笨拙(但可能我错了)


    提前谢谢!

    你是说这样吗

    Future<String> getPosts() async { //do_something }
    
    _refreshAction() {
        setState(() {
          this.getPosts();
        });
      }
    
    
    onPressed: () { _refreshAction(); }
    
    Future getPosts()异步{//do\u something}
    _刷新操作(){
    设置状态(){
    这是getPosts();
    });
    }
    onPressed:(){u refreshAction();}
    
    也许您可以使用
    回调样式
    事件在小部件之间进行通信。(使用
    VoidCallback和
    函数(x)
    与flatter进行通信)

    示例:

    在这里,我们添加了一个名为onCountChange的新函数(int),我们正在调用该函数,其值要传递回父函数

    // counter_page.dart
    import 'package:flutter/material.dart';
    
    class Count extends StatelessWidget {
      final int count;
      final VoidCallback onCountSelected; // <<<
    
      final Function(int) onCountChange; //  <<<
    
      Count({
        @required this.count,
        @required this.onCountChange,
        this.onCountSelected,
      });
    
      @override
      Widget build(BuildContext context) {
        return Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            IconButton(
              icon: Icon(Icons.add),
              onPressed: () {
                onCountChange(1);
              },
            ),
            FlatButton(
              child: Text("$count"),
              onPressed: () => onCountSelected(),
            ),
            IconButton(
              icon: Icon(Icons.remove),
              onPressed: () {
                onCountChange(-1);
              },
            ),
          ],
        );
      }
    }
    
    //计数器\u page.dart
    进口“包装:颤振/材料.省道”;
    类计数扩展了无状态小部件{
    最终整数计数;
    
    final VoidCallback onCountSelected;//refreshAction()是正确的。复杂性来自onPressed()部分。它实际上是一个TextField(具有onChanged()方法)。但是,TextField现在与getPosts()不在同一个类中,无法访问它。TextField和“自定义小部件”类在父屏幕中是同级的。我可以将textfield中的值作为参数传递给它的构造函数中的自定义小部件,但我不能使用initState()或build()。我开始认为继承的小部件是答案,但对于我需要做的事情来说它似乎太重了。谢谢!@bl4ckck在包装类中获得setState()的错误。从尝试调用活动类方法的模型类开始。
    class _CounterPageState extends State<CounterPage> {
      int count = 0;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text("Counter Page")),
          body: Center(
            child: Count(
              count: count,
              onCountSelected: () {//<<< Listen to the onCountSelected callback
                print("Count was selected.");
              },
              onCountChange: (int val) { // <<< return a value back to the parent
                setState(() => count += val);
              },
            ),
          ),
        );
      }
    }