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}'),
),
);
}
}
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.
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:
this.
Les préfixes sont des variables de la superclasse.this.
sont des variables définies dans la classe en cours.