Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IT docs translation #3086

Merged
merged 37 commits into from
Dec 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
d21524d
it-IT translation: 'introduction' folder
marcoredz Nov 1, 2023
a7eab71
it-IT translation: 'from_provider' folder
marcoredz Nov 1, 2023
792f6b9
Merge branch 'master' into docs-it-translation
marcoredz Nov 1, 2023
d56c85e
it-IT translation: 'first_request' folder
marcoredz Nov 11, 2023
ea74774
Merge branch 'master' into docs-it-translation
marcoredz Nov 22, 2023
e5d63cb
it-IT translation: fixes for 'first_request' file
marcoredz Nov 22, 2023
7f81cb3
Reset 'i18n/it' folder to fix build issues
marcoredz Nov 25, 2023
96294f1
Re-apply 'introduction' folder
marcoredz Nov 25, 2023
5a53d09
Re-apply 'from_provider' folder
marcoredz Nov 25, 2023
e3f1d9a
Re-apply 'first_request' folder
marcoredz Nov 25, 2023
d981967
it-IT translation: 'side_effects' folder
marcoredz Nov 25, 2023
b751aa5
Fix code generation diff issue
marcoredz Nov 25, 2023
b9d4ad9
it-IT translation: 'passing_args' folder
marcoredz Nov 26, 2023
8a2a1ca
it-IT translation: 'websockets_sync' folder
marcoredz Nov 26, 2023
e2700aa
it-IT translation: 'combining_requests' folder
marcoredz Nov 28, 2023
77f1912
Merge branch 'master' into docs-it-translation
marcoredz Nov 28, 2023
8533d5d
it-IT translation: 'auto_dispose' folder
marcoredz Dec 2, 2023
3f8d7b4
it-IT translation: 'eager_initialization' folder
marcoredz Dec 3, 2023
56fb4cd
it-IT translation: 'testing' folder
marcoredz Dec 7, 2023
bf6520b
it-IT translation: 'loggin and error reporting'
marcoredz Dec 8, 2023
a3b1a97
it-IT translation: 'faq'
marcoredz Dec 8, 2023
09b42c9
it-IT translation: 'do_dont'
marcoredz Dec 8, 2023
2c1b92a
it-IT translation: general fixes
marcoredz Dec 8, 2023
28a52cf
Merge branch 'master' into docs-it-translation
marcoredz Dec 8, 2023
c9c367e
it-IT translation: 'pull_to_refresh'
marcoredz Dec 8, 2023
e4842e5
it-IT translation: debouncing/cancelling network requests
marcoredz Dec 9, 2023
7472660
it-IT translation: minor fix
marcoredz Dec 9, 2023
2a6e8db
Fix flutter analyze error
marcoredz Dec 9, 2023
e8768d0
Fix italian quickstart.mdx
marcoredz Dec 11, 2023
fe8d86e
it-IT translation: optimizing performance
marcoredz Dec 11, 2023
1b87d63
Fix commit fe8d86e2
marcoredz Dec 16, 2023
e1e7025
Merge branch 'master' into docs-it-translation
marcoredz Dec 16, 2023
30d0864
it-IT translation: about code generation
marcoredz Dec 17, 2023
f287e14
it-IT translation: about hooks
marcoredz Dec 17, 2023
4839227
Fix code generation files
marcoredz Dec 18, 2023
4b5a6fb
it-IT translation: from_state_notifier
marcoredz Dec 19, 2023
d3bf422
it-IT translation: from_change_notifier
marcoredz Dec 24, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
20 changes: 20 additions & 0 deletions website/i18n/it/docusaurus-plugin-content-docs/current.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,26 @@
"message": "Prossimo",
"description": "The label for version current"
},
"sidebar.Sidebar.category.Introduction": {
"message": "Introduzione",
"description": "The label for category Introduction in sidebar Sidebar"
},
"sidebar.Sidebar.category.Riverpod for Provider Users": {
"message": "Riverpod per utenti di Provider",
"description": "The label for category Riverpod for Providers Users in sidebar Sidebar"
},
"sidebar.Sidebar.category.Essentials": {
"message": "Fondamentali",
"description": "The label for category Essentials in sidebar Sidebar"
},
"sidebar.Sidebar.category.Case studies": {
"message": "Argomenti di studio",
"description": "The label for category Case studies in sidebar Sidebar"
},
"sidebar.Sidebar.category.Advanced topics": {
"message": "Argomenti avanzati",
"description": "The label for category Case studies in sidebar Advanced topics"
},
"sidebar.Sidebar.category.Guides": {
"message": "Guide",
"description": "The label for category Guides in sidebar Sidebar"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
---
title: Ottimizzare le performance
---

import { AutoSnippet } from "../../../../../src/components/CodeSnippet";
import select from "./select/select";

import selectAsync from "./select/select_async";

Con tutto ciò che abbiamo visto fino ad ora, possiamo già costruire un'applicazione
completamente funzionante. Tuttavia, potresti avere delle domande riguardo alle performance.

In questa pagina copriremo alcuni consigli e trucchi per ottimizzare possibilmente il tuo codice.

:::caution
Prima di fare qualsiasi ottimizzazione, assicurati di misurare le prestazioni della tua applicazione.
Potrebbe non essere conveniente affrontare la complessità delle ottimizzazioni se i benefici ottenuti sono limitati.
:::

## Filtrare i rebuild dei widget/provider usando "select".

Avrai notato che, di default, usare `ref.watch` provoca la ricostruzione
dei consumer/provider ogni volta che _qualsiasi_ delle proprietà di un oggetto cambia.
Per fare un esempio, osservare un oggetto `User` ed usare solo la sua proprietà "name"
causerà la ricostruzione del consumer anche se è solo la proprietà "age" a cambiare.

Ma nel caso tu abbia un consumer che usa solo un subset di proprietà, vuoi
evitare di ricostruire il widget quando altre proprietà cambiano.

Questo comportamento può essere ottenuto usando la funzionalità `select` dei provider.
Quando lo si usa, `ref.watch` non restituirà più l'oggetto completo ma le proprietà selezionate.
Ora i tuoi consumer/provider si ricostruiranno solo se quelle proprietà selezionate cambieranno.

<AutoSnippet {...select} />

:::info
È possibile chiamare `select` quante volte si desidera.
Sei libero di chiamarlo una volta per la proprietà che desideri.
:::

:::caution
Si prevede che le proprietà selezionate siano immutabili.
Restituire una `List` per poi mutarla non azionerà un rebuild.
:::

:::caution
Usare `select` rallenta leggermente le singole operazioni di lettura ed
aumenterà di poco la complessità del tuo codice.
Potrebbe non valere la pena usarlo se quelle "altre proprietà" cambiano raramente.
:::

### Selezionare proprietà asincrone

Nel caso tu stia provando ad ottimizzare un provider che ascolta un altro provider,
potrebbe capitare che l'altro provider sia asincrono.

Normalmente, useresti `ref.watch(anotherProvider.future)` per ottenere il valore.
Il problema è che, `select` si applicherà solo su `AsyncValue`, il quale non è qualcosa
che puoi aspettare.

A questo scopo è possibile utilizzare invece `selectAsync`. È unicamente per il
codice asincrono e permette di eseguire un'operazione `select` sul dato emesso da un provider.
Il suo utilizzo è simile a quello di `select` ma restituisce un `Future`:

<AutoSnippet {...selectAsync} />
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// ignore_for_file: unused_local_variable, avoid_multiple_declarations_per_line, omit_local_variable_types, prefer_final_locals, use_key_in_widget_constructors

import 'package:flutter/widgets.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

part 'codegen.g.dart';

/* SNIPPET START */
class User {
late String firstName, lastName;
}

@riverpod
User example(ExampleRef ref) => User()
..firstName = 'John'
..lastName = 'Doe';

class ConsumerExample extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
// Invece di scrivere:
// String name = ref.watch(provider).firstName!;
// Possiamo scrivere:
String name = ref.watch(exampleProvider.select((it) => it.firstName));
// In questo modo il widget ascolterà solo i cambiamenti della proprietà "firstName".

return Text('Hello $name');
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import raw from '!!raw-loader!./raw.dart';
import codegen from '!!raw-loader!./codegen.dart';

export default { raw, codegen };
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// ignore_for_file: unused_local_variable, avoid_multiple_declarations_per_line, omit_local_variable_types, prefer_final_locals, use_key_in_widget_constructors

import 'package:flutter/widgets.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

/* SNIPPET START */
class User {
late String firstName, lastName;
}

final provider = Provider(
(ref) => User()
..firstName = 'John'
..lastName = 'Doe',
);

class ConsumerExample extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
// Invece di scrivere:
// String name = ref.watch(provider).firstName!;
// Possiamo scrivere:
String name = ref.watch(provider.select((it) => it.firstName));
// In questo modo il widget ascolterà solo i cambiamenti della proprietà "firstName".

return Text('Hello $name');
}
}
/* SNIPPET END */
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// ignore_for_file: unused_local_variable, avoid_multiple_declarations_per_line, omit_local_variable_types, prefer_final_locals, use_key_in_widget_constructors, body_might_complete_normally_nullable

import 'package:riverpod_annotation/riverpod_annotation.dart';

part 'codegen.g.dart';

class User {
late String firstName, lastName;
}

final userProvider = FutureProvider(
(ref) => User()
..firstName = 'John'
..lastName = 'Doe',
);
/* SNIPPET START */
@riverpod
Object? example(ExampleRef ref) async {
// Aspetta che un utente sia disponibile, ed ascolta solo la proprietà "firstName"
final firstName = await ref.watch(
userProvider.selectAsync((it) => it.firstName),
);

// TODO usa "firstName" per ottenere qualcos'altro
}
/* SNIPPET END */

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import raw from '!!raw-loader!./raw.dart';
import codegen from '!!raw-loader!./codegen.dart';

export default { raw, codegen };
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// ignore_for_file: unused_local_variable, avoid_multiple_declarations_per_line, omit_local_variable_types, prefer_final_locals, use_key_in_widget_constructors

import 'package:flutter_riverpod/flutter_riverpod.dart';

class User {
late String firstName, lastName;
}

final userProvider = FutureProvider(
(ref) => User()
..firstName = 'John'
..lastName = 'Doe',
);
/* SNIPPET START */
final provider = FutureProvider((ref) async {
// Aspetta che un utente sia disponibile, ed ascolta solo la proprietà "firstName"
final firstName = await ref.watch(
userProvider.selectAsync((it) => it.firstName),
);

// TODO usa "firstName" per ottenere qualcos'altro
});
/* SNIPPET END */
Loading
Loading