重构时无法提取对封闭类方法的引用

Beh*_*zad 13 android dart android-studio flutter

当我想做“提取到小部件”时,它会引发错误:“无法提取对封闭类方法的引用”

我知道有一些变量必须从类构造函数中获取它们的数据,但我希望 Android studio 提取小部件,然后我将更正错误的代码,例如 Visual Studio,没有任何错误将代码提取到新的小部件然后它需要将新提取的小部件复制到新的 dart 文件并更正错误。

我想提取卡片小部件部分。

import 'package:flutter/material.dart';
import 'package:flutter/material.dart' as prefix0;
import 'package:intl/intl.dart';
import '../model/transaction.dart';

class TransactionList extends StatelessWidget {
  final List<Transaction> transactions;
  final Function deleteTx;

  TransactionList(this.transactions, this.deleteTx);

  @override
  Widget build(BuildContext context) {
    return transactions.isEmpty
        ? LayoutBuilder(
            builder: (ctx, constraint) {
              return Column(
                children: <Widget>[
                  Text(
                    'There is no transaction',
                    style: Theme.of(context).textTheme.title,
                    textDirection: prefix0.TextDirection.rtl,
                  ),
                  SizedBox(
                    height: 10,
                  ),
                  Container(
                      height: constraint.maxHeight * 0.6,
                      child: Image.asset(
                        'assets/images/yalda.png',
                        fit: BoxFit.cover,
                      ))
                ],
              );
            },
          )
        : ListView.builder(
            itemCount: transactions.length,
            itemBuilder: (ctx, index) {
              return **Card**(
                margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 5),
                elevation: 5,
                child: ListTile(
                  leading: CircleAvatar(
                    radius: 30,
                    child: Padding(
                      padding: const EdgeInsets.all(8),
                      child: FittedBox(
                          child: Text('\$${transactions[index].amount}')),
                    ),
                  ),
                  title: Text(
                    transactions[index].title,
                    style: Theme.of(context).textTheme.title,
                  ),
                  subtitle: Text(DateFormat.yMMMd()
                      .format(transactions[index].date)
                      .toString()),
                  trailing: MediaQuery.of(context).size.width > 360
                      ? FlatButton.icon(
                          onPressed: () => deleteTx(transactions[index].id),
                          icon: const Icon(Icons.delete),
                          label: const Text('Delete'),
                    textColor: Theme.of(context).errorColor,
                  )
                      : IconButton(
                          icon: const Icon(Icons.delete),
                          color: Theme.of(context).errorColor,
                          onPressed: () => deleteTx(transactions[index].id),
                        ),
                ),
              );
            });
  }
}
Run Code Online (Sandbox Code Playgroud)

Tos*_*ade 18

只需使用“提取方法”而不是“提取小部件”。VSCode 将添加所有返回和引用。

编辑:如果您只想使用“提取小部件”,只需将该小部件包装在容器中,然后在该小部件上使用“提取小部件”。如果这不起作用,请在小部件中注释掉 setState() 函数并重试。

  • 我们可以使用 Extract 方法或者手动提取 widget,但是何时使用 extract 方法或提取 widget 有什么约定吗?抱歉,我是 Flutter 新手:) (4认同)

小智 8

您的deleteTx可能包含setState(() {})方法,尝试注释您调用deleteTx的代码部分,然后在提取后将其放回原处。


Naz*_*sab 2

我有同样的问题,就我而言,这是因为ListView.builder和你一样。

因此很容易修复,只需创建一个类并在Widget 构建中返回 Card ,然后使用所需的参数在TransactionList 类内的ListView.builder中返回它。