【问题标题】:Flutter: How to pass parameter to FutureBuilder future instance?Flutter:如何将参数传递给 FutureBuilder 未来实例?
【发布时间】:2020-11-24 01:41:40
【问题描述】:

为了防止重建,我在FutureBuilder 中使用未来实例_futureInstance

var _futureInstance;

Future _loadData() async {
    // ...
}

@override
void initState() {
    super.initState();
    _futureInstance = _loadData();
}

@override
Widget build(BuildContext context) {
    body: FutureBuilder(
        future: _futureInstance,
        // ...
    )
}

效果很好,现在如果_loadData方法有参数,比如_loadData(int i),怎么把参数i传给_futureInstance

【问题讨论】:

  • 如果它有一个参数,那应该会导致重建吧??如果它是一个时间参数,在 initState 中传递它有什么问题??
  • 给亚都:这个参数是从上一页传过来的。页面。
  • 您的问题不清楚,有很多答案可以将参数传递给路由

标签: flutter dart flutter-futurebuilder


【解决方案1】:

我用另一种方式解决了这个问题,使用MaterialApp.onGenerateRoute

作为这个答案:Flutter: Get passed arguments from Navigator in Widget's state's initState

我在initState方法中获取参数:

  @override
  void initState() {
    super.initState();
    _futureInstance = _loadData(widget.parameter_key);
    // ...

build,代码不变:

@override
Widget build(BuildContext context) {
    body: FutureBuilder(
        future: _futureInstance,
        // ...
    )
}

这样_loadData方法可以使用各种参数,并且在调用setState时不会重建widget。

【讨论】:

    【解决方案2】:
    @override
    void initState() {
        super.initState();
        _futureInstance = (int i) => _loadData(i);
    }
    
    @override
    Widget build(BuildContext context) {
        body: FutureBuilder(
            future: _futureInstance(1), // pass your number here
            // ...
        )
    }
    

    【讨论】:

    • 是的,以我可以传递参数的方式,但是每次调用setState,都会重新构建小部件并调用_loadData...
    【解决方案3】:

    不确定 _futureInstance 的用途,也许您不需要定义实例?

    Future _loadData(val) async {
        // ...
    }
    
    @override
    void initState() {
        super.initState();
    }
    
    @override
    Widget build(BuildContext context) {
        body: FutureBuilder(
            future: _loadData(1),
            // ...
        )
    }
    

    【讨论】:

    • OP 已经解释了为什么这正是他们不想要的不同答案。
    • 我想我错过了第一行,而 OP 应该使用 streambuilder 而不是 futurebuilder。 FutureBuilder 并不意味着要重建,但 streambuilder 会。
    • 你还是误会了。 “是的,以我可以传递参数的方式,但是每次调用 setState 时,都会重新构建小部件并调用 _loadData。”当setState 被调用时,_loadData 将被调用,这是不受欢迎的行为。
    【解决方案4】:

    我会这样接近

    
    var _lastInt = 0;
    var _lastFuture;
    
    
    Future _loadData(int i) async {
      if(_lastInt!=i||_lastFuture==null){
        //do work
        _lastInt = i;
        _lastFuture = ;
      }
      return _lastFuture;
    }
    
    
    @override
    Widget build(BuildContext context) {
      body: FutureBuilder(
        future: _loadData(1),
        // ...
      );
    
    

    【讨论】:

    • OP 已经解释了为什么这正是他们在两个不同的答案中不想要的。
    猜你喜欢
    • 1970-01-01
    • 2021-09-24
    • 2020-10-12
    • 2021-12-20
    • 2018-08-19
    • 2019-06-26
    • 2014-05-24
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多