22
loading...
This website collects cookies to deliver better user experience
Flutter
existen varias maneras, en este post abordaremos Provider
, una biblioteca bastante popular que nos ayudará con este trabajo.Provider
, vamos a realizar una sencilla aplicación que nos ejemplifique. AppBar
y su título, en el centro un Text
, y dos botones flotantes en la esquina inferior derecha, que tendrán como función cambiar el valor del texto que será mostrado tanto en el título del AppBar
como en el Text
del body de la app.provider: ^5.0.0
(En el momento que escribí el post esta era la versión). lib/widgets/floating_actions.dart
para crear el widget con los dos botones flotantes:import 'package:flutter/material.dart';
class FloatingAction extends StatelessWidget {
@override
Widget build(BuildContext context) {
(context);
return Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
FloatingActionButton(
child: Icon(Icons.wifi),
backgroundColor: Colors.orange,
onPressed: () {}),
SizedBox(
height: 10.0,
),
FloatingActionButton(
child: Icon(Icons.bluetooth),
backgroundColor: Colors.blue,
onPressed: () {})
],
);
}
}
onPressed
lo tenemos sin acción, más adelante agregaremos su funcionalidad.lib/widgets
crearemos otro archivo llamado body, lib/widgets/body.dart
para crear el widget
con el texto centralizado.import 'package:flutter/material.dart';
class Body extends StatelessWidget {
@override
Widget build(BuildContext context) {
(context);
return Center(
child: Text("",
style: TextStyle(fontSize: 20),
),
);
}
}
widget
dentro de lib, llamado home lib/Home.dart
:import 'package:flutter/material.dart';
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Center(child: Text("")),
),
body: Body(),
floatingActionButton: FloatingAction(),
);
}
}
Scaffold
, con un AppBar
y su título vacío por el momento, además renderizamos los widgets
Body
y FloatingAction
creados anteriormente.Provider
aún, solo vamos armando la interfaz gráfica de la app, pasemos a modificar el main.dart
.main.dart
debería lucir así por el momento:import 'package:flutter/material.dart';
import 'package:provider_pattern/home.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Provider',
home: Home()
);
}
}
Provider
; hagamos lo siguiente:lib/provider/signal_mode.dart
import 'package:flutter/material.dart';
class SignalMode extends ChangeNotifier {
String _signalMode = 'Wifi mode';
String get signalMode => _signalMode;
set signalMode(String mode) {
this._signalMode = mode;
notifyListeners();
}
}
Provider
, es la clase que se ocupa de centralizar el valor de la variable privada _signalMode
de tipo String
que es el texto que se mostrará tanto en el título del AppBar
como en el centro de la pantalla.ChangeNotifier
clase encargada de exponer los eventos de notificación,get
para obtener el valor de _signalMode
, y un método set
para modificarlo, dentro de este método vemos la llamada a notifyListeners()
que es quien va a notificar a todos los widgets
que escuchen a este provider del cambio, para asi actualizar su estado.widgets
que van a escuhar los cambios. main
. main
quedaría de la siguiente forma:import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:provider_pattern/home.dart';
import 'package:provider_pattern/provider/signal_mode.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => SignalMode(),
child: MaterialApp(
title: 'Provider',
home: Home()),
);
}
}
SignalMode
widgets
de nuestra app. Modifiquemos la clase FloatingAction
para conectarla con nuestro Provider
quedando de la siguiente forma:import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:provider_pattern/provider/signal_mode.dart';
class FloatingAction extends StatelessWidget {
@override
Widget build(BuildContext context) {
final signal = Provider.of<SignalMode>(context);
return Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
FloatingActionButton(
child: Icon(Icons.wifi),
backgroundColor: Colors.orange,
onPressed: () {
signal.signalMode = "Wifi mode";
}),
SizedBox(
height: 10.0,
),
FloatingActionButton(
child: Icon(Icons.bluetooth),
backgroundColor: Colors.blue,
onPressed: () {
signal.signalMode = "Bluetooth mode";
})
],
);
}
}
final signal = Provider.of<SignalMode>(context);
Provider
especificando que es de tipo SignalMode
. onPressed
de los botones, cada uno hace una llamada modificando el valor de signalMode
onPressed: () {
signal.signalMode = "Wifi mode";
})
onPressed: () {
signal.signalMode = "Bluetooth mode";
})
import 'package:flutter/material.dart';
import 'package:provider_pattern/provider/signal_mode.dart';
import 'package:provider_pattern/widgets/body.dart';
import 'package:provider_pattern/widgets/floating_actions.dart';
import 'package:provider/provider.dart';
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
final signal = Provider.of<SignalMode>(context);
return Scaffold(
appBar: AppBar(
title: Center(child: Text(signal.signalMode)),
),
body: Body(),
floatingActionButton: FloatingAction(),
);
}
}
Home
igualmente obtenemos la instancia del Provider
y leemos la propiedad signalHome
.Body
:import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:provider_pattern/provider/signal_mode.dart';
class Body extends StatelessWidget {
@override
Widget build(BuildContext context) {
final signal = Provider.of<SignalMode>(context);
return Center(
child: Text(
signal.signalMode,
style: TextStyle(fontSize: 20),
),
);
}
}
main
de la siguiente forma:void main() => runApp(AppState());
class AppState extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => SignalMode())
],
child: MyApp(),
);
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Provider',
home: Home()
);
}
}
MultiPorvider
admite un arreglo de Provider
:providers: [
ChangeNotifierProvider(create: (_) => SignalMode())
],