web-dev-qa-db-fra.com

Flutter Dart constructeur

Dans la page Exemples flottants, vous trouverez un projet intitulé "Envoi de données à un nouvel écran". J'ai une question concernant le constructeur sur la ligne 65.

Envoi de données à un nouvel écran

  // In the constructor, require a Todo
  DetailScreen({Key key, @required this.todo}) : super(key: key);

Quel est le super (clé: clé)? Pourrais-je avoir une explication de toute la ligne s'il vous plaît? Le code est ici ....

import 'package:flutter/foundation.Dart';
import 'package:flutter/material.Dart';

class Todo {
  final String title;
  final String description;

  Todo(this.title, this.description);
}

void main() {
  runApp(MaterialApp(
    title: 'Passing Data',
    home: TodosScreen(
      todos: List.generate(
        20,
            (i) => Todo(
          'Todo $i',
          'A description of what needs to be done for Todo $i',
        ),
      ),
    ),
  ));
}

class TodosScreen extends StatelessWidget {
  final List<Todo> todos;

  TodosScreen({Key key, @required this.todos}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Todos'),
      ),
      body: ListView.builder(
        itemCount: todos.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(todos[index].title),
            // When a user taps on the ListTile, navigate to the DetailScreen.
            // Notice that we're not only creating a DetailScreen, we're
            // also passing the current todo through to it!
            onTap: () {
              Navigator.Push(
                context,
                MaterialPageRoute(
                  builder: (context) => DetailScreen(todo: todos[index]),
                ),
              );
            },
          );
        },
      ),
    );
  }
}

class DetailScreen extends StatelessWidget {
  // Declare a field that holds the Todo
  final Todo todo;

  // In the constructor, require a Todo
  DetailScreen({Key key, @required this.todo}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    // Use the Todo to create our UI
    return Scaffold(
      appBar: AppBar(
        title: Text("${todo.title}"),
      ),
      body: Padding(
        padding: EdgeInsets.all(16.0),
        child: Text('${todo.description}'),
      ),
    );
  }
}
9
IrishGringo

Le constructeur a deux paramètres nommés.
Les paramètres nommés sont facultatifs par défaut.
@required est une annotation reconnue par l’analyseur Dart et produit un avertissement si elle n’est pas transmise lorsqu’elle est appelée au moment de la construction (elle n’a aucun effet au moment de l’exécution).

: lance la "liste d'initialiseurs", liste d'expressions exécutées avant les constructeurs des super-classes et donc également avant le corps des constructeurs.
Il est souvent utilisé pour vérifier les valeurs de paramètre à l'aide d'assertions et pour initialiser les champs finaux avec des valeurs calculées.
Une limitation est que les expressions ne peuvent pas accéder en lecture this. (implicitement ou explicitement) car l'initialisation de l'objet n'est pas terminée avant l'exécution des super constructeurs.

Le dernier élément de l'initialiseur est un appel implicite au constructeur par défaut de la super-classe, s'il est omis, ou à l'appel d'un constructeur spécifique de la classe en cours ou de la super-classe, le cas échéant.

Dans l'exemple de votre question, le paramètre key transmis au constructeur est transmis au paramètre nommé key du constructeur sans nom de la super-classe.

12
Günter Zöchbauer

Cet exemple complète les explications de Günter Zöchbauer. C'est le constructeur du widget Align .

class Align extends SingleChildRenderObjectWidget {

  // constructor
  const Align({
    Key key,                                                   // named parameter
    this.alignment = Alignment.center,                         // named parameter
    this.widthFactor,                                          // named parameter
    this.heightFactor,                                         // named parameter
    Widget child                                               // named parameter
  }) : assert(alignment != null),                              // initializer list
       assert(widthFactor == null || widthFactor >= 0.0),      // initializer list
       assert(heightFactor == null || heightFactor >= 0.0),    // initializer list
       super(key: key, child: child);                          // initializer list

  // class variables
  final AlignmentGeometry alignment;
  final double widthFactor;
  final double heightFactor;

Plus de notes:

  • paramètres sans le this. Les préfixes sont des variables de la superclasse.
  • paramètres qui commencent par this. sont des variables définies dans la classe en cours.
11
Suragch