Flutter/package:provider
提供: 初心者エンジニアの簡易メモ
package:providerとは
テストしやすいように状態とロジックを分離したもの。 (provider と ChangeNotifier)
公式
https://pub.dev/packages/provider
インストール
pubspec.yaml
dependencies: provider: ^4.0.3
package:provider対応前
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { int _counter = 0; void _incrementCounter() { setState(() { _counter++; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text( 'You have pushed the button this many times:', ), Text( '$_counter', style: Theme.of(context).textTheme.display1, ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Increment', child: Icon(Icons.add), ), ); } }
package:provider対応後
import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class CounterStore with ChangeNotifier { var counter = 0; void incrementCounter() { counter++; notifyListeners(); } } void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: ChangeNotifierProvider( create: (context) => CounterStore(), child: MyHomePage(title: 'Flutter Demo Home Page'), ), ); } } class MyHomePage extends StatelessWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override Widget build(BuildContext context) { return Consumer<CounterStore>( builder: (context, counterStore, _) { return Scaffold( appBar: AppBar( title: Text(title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text( 'You have pushed the button this many times:', ), Text( '${counterStore.counter}', style: Theme.of(context).textTheme.display1, ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: counterStore.incrementCounter, tooltip: 'Increment', child: Icon(Icons.add), ), ); }, ); } }
変更箇所
MyHomePage が StatelessWidget になってる。 counterがcounterStoreのcounterへ