web-dev-qa-db-fra.com

La référence à une méthode de classe englobante ne peut pas être extraite lors de la refactorisation

Lorsque je veux faire "Extraire vers un widget", cela génère une erreur: "la référence à une méthode de classe englobante ne peut pas être extraite"

Je sais qu'il y a des variables qui doivent obtenir leurs données du constructeur de classe mais je veux Android studio pour extraire le widget alors, je corrigerai les codes erronés, comme Visual Studio qui sans aucune erreur extraire le code vers un nouveau widget, puis il doit copier le nouveau widget extrait dans un nouveau fichier Dart et corriger les erreurs.

Je souhaite extraire la partie du widget Carte.

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),
                        ),
                ),
              );
            });
  }
}
5
Behzad

Utilisez simplement "Extract Method" au lieu de "Extract Widget". Flutter ajoutera tous les retours et références.

2
Toshik Langade

J'ai eu le même problème et dans mon cas, c'était à cause de ListView.builder comme le vôtre.

Donc c'est facile à réparer, il suffit de créer une classe et de renvoyer Card dans Widget build et renvoyez-le dans ListView.builder à l'intérieur de la classe TransactionList avec les arguments souhaités.

0
dranoer