Introducció
El deep linking és una tècnica que permet als usuaris navegar directament a una pàgina específica dins d'una aplicació mòbil o web, utilitzant un enllaç URL. Aquesta funcionalitat és especialment útil per a millorar l'experiència de l'usuari, ja que permet accedir a continguts específics de manera ràpida i directa.
Objectius
En aquesta secció, aprendràs:
- Què és el deep linking i per què és important.
- Com configurar deep linking en una aplicació Flutter.
- Com gestionar els enllaços profunds dins de la teva aplicació.
Què és el Deep Linking?
El deep linking permet que un enllaç URL porti l'usuari directament a una pàgina específica dins de l'aplicació, en lloc de simplement obrir l'aplicació a la seva pàgina principal. Hi ha dos tipus principals de deep linking:
- Deep Linking Tradicional: Utilitza URL estàndard per obrir una aplicació i navegar a una pàgina específica.
- Deep Linking Universal/App Links: Utilitza URL que funcionen tant en aplicacions mòbils com en navegadors web.
Configuració de Deep Linking en Flutter
Pas 1: Configuració del Projecte
- Afegir Dependències: Afegeix les dependències necessàries al fitxer
pubspec.yaml
.
- Configuració d'Android: Afegeix la configuració necessària al fitxer
AndroidManifest.xml
.
<activity android:name=".MainActivity" android:launchMode="singleTask" android:configChanges="keyboard|keyboardHidden|orientation|screenSize" android:theme="@style/LaunchTheme" android:windowSoftInputMode="adjustResize"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="https" android:host="example.com"/> </intent-filter> </activity>
- Configuració d'iOS: Afegeix la configuració necessària al fitxer
Info.plist
.
<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>https</string> </array> <key>CFBundleURLName</key> <string>example.com</string> </dict> </array> <key>LSApplicationQueriesSchemes</key> <array> <string>https</string> </array>
Pas 2: Implementació del Deep Linking
- Inicialització: Inicialitza el deep linking en el fitxer principal de la teva aplicació.
import 'package:flutter/material.dart'; import 'package:uni_links/uni_links.dart'; import 'dart:async'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { StreamSubscription _sub; @override void initState() { super.initState(); initUniLinks(); } Future<void> initUniLinks() async { _sub = getLinksStream().listen((String link) { if (!mounted) return; // Gestiona l'enllaç aquí print('Enllaç rebut: $link'); }, onError: (err) { // Gestiona l'error aquí }); } @override void dispose() { _sub.cancel(); super.dispose(); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Deep Linking Example'), ), body: Center( child: Text('Esperant enllaç...'), ), ), ); } }
- Gestió de l'Enllaç: Gestiona l'enllaç rebut per navegar a la pàgina corresponent.
Future<void> initUniLinks() async { _sub = getLinksStream().listen((String link) { if (!mounted) return; // Gestiona l'enllaç aquí if (link != null) { Uri uri = Uri.parse(link); if (uri.pathSegments.contains('product')) { String productId = uri.queryParameters['id']; Navigator.push( context, MaterialPageRoute( builder: (context) => ProductPage(id: productId), ), ); } } }, onError: (err) { // Gestiona l'error aquí }); }
Exercici Pràctic
Objectiu
Implementar deep linking en una aplicació Flutter que permeti navegar a una pàgina de producte específica.
Passos
- Configura el projecte seguint els passos anteriors.
- Crea una pàgina de producte (
ProductPage
) que mostri informació basada en l'ID del producte. - Implementa la gestió de l'enllaç per navegar a la
ProductPage
quan es rebi un enllaç amb el camí/product
i un paràmetreid
.
Solució
import 'package:flutter/material.dart'; import 'package:uni_links/uni_links.dart'; import 'dart:async'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { StreamSubscription _sub; @override void initState() { super.initState(); initUniLinks(); } Future<void> initUniLinks() async { _sub = getLinksStream().listen((String link) { if (!mounted) return; if (link != null) { Uri uri = Uri.parse(link); if (uri.pathSegments.contains('product')) { String productId = uri.queryParameters['id']; Navigator.push( context, MaterialPageRoute( builder: (context) => ProductPage(id: productId), ), ); } } }, onError: (err) { // Gestiona l'error aquí }); } @override void dispose() { _sub.cancel(); super.dispose(); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Deep Linking Example'), ), body: Center( child: Text('Esperant enllaç...'), ), ), ); } } class ProductPage extends StatelessWidget { final String id; ProductPage({this.id}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Product Page'), ), body: Center( child: Text('Product ID: $id'), ), ); } }
Conclusió
El deep linking és una funcionalitat poderosa que millora l'experiència de l'usuari permetent accedir directament a continguts específics dins de l'aplicació. En aquesta secció, has après a configurar i implementar deep linking en una aplicació Flutter, així com a gestionar els enllaços per navegar a pàgines específiques. Amb aquesta base, pots explorar més opcions avançades de deep linking per adaptar-les a les necessitats de la teva aplicació.
Curs de Desenvolupament Flutter
Mòdul 1: Introducció a Flutter
- Què és Flutter?
- Configuració de l'Entorn de Desenvolupament
- Comprensió de l'Arquitectura de Flutter
- Creació de la Teva Primera Aplicació Flutter
Mòdul 2: Conceptes Bàsics de Programació en Dart
- Introducció a Dart
- Variables i Tipus de Dades
- Sentències de Flux de Control
- Funcions i Mètodes
- Programació Orientada a Objectes en Dart
Mòdul 3: Widgets de Flutter
- Introducció als Widgets
- Widgets Stateless vs Stateful
- Widgets Bàsics
- Widgets de Disseny
- Widgets d'Entrada i Formulari
Mòdul 4: Gestió de l'Estat
Mòdul 5: Navegació i Enrutament
- Introducció a la Navegació
- Navegació Bàsica
- Rutes Nomenades
- Passar Dades Entre Pantalles
- Deep Linking
Mòdul 6: Xarxes i APIs
- Obtenir Dades d'Internet
- Analitzar Dades JSON
- Gestió d'Errors de Xarxa
- Ús d'APIs REST
- Integració de GraphQL
Mòdul 7: Persistència i Emmagatzematge
- Introducció a la Persistència
- Preferències Compartides
- Emmagatzematge de Fitxers
- Base de Dades SQLite
- Ús de Hive per a l'Emmagatzematge Local
Mòdul 8: Conceptes Avançats de Flutter
- Animacions en Flutter
- Pintura Personalitzada i Canvas
- Canals de Plataforma
- Isolates i Concurrència
- Optimització del Rendiment
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries
- Proves de Widgets
- Proves d'Integració
- Tècniques de Depuració
Mòdul 10: Desplegament i Manteniment
- Preparació per al Llançament
- Construcció per a iOS
- Construcció per a Android
- Integració i Desplegament Continu (CI/CD)
- Manteniment i Actualització de la Teva Aplicació