-1

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

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

4

4 回答 4

0

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

作为这个答案:Flutter:在 Widget 的状态的 initState 中从 Navigator 获取传递的参数

我在initState方法中得到参数:

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

在 中build,代码不变:

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

这样,该方法_loadData可以使用各种参数,并且在setState调用时不会重新构建小部件。

于 2020-11-24T07:42:48.370 回答
-1

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

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

@override
void initState() {
    super.initState();
}

@override
Widget build(BuildContext context) {
    body: FutureBuilder(
        future: _loadData(1),
        // ...
    )
}
于 2020-11-24T02:25:58.507 回答
-1
@override
void initState() {
    super.initState();
    _futureInstance = (int i) => _loadData(i);
}

@override
Widget build(BuildContext context) {
    body: FutureBuilder(
        future: _futureInstance(1), // pass your number here
        // ...
    )
}
于 2020-11-24T02:20:18.787 回答
-1

我会这样接近


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),
    // ...
  );

于 2020-11-24T06:07:46.987 回答