「Flutter/package:provider」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→package:provider対応後) |
|||
(同じ利用者による、間の3版が非表示) | |||
行5: | 行5: | ||
==公式== | ==公式== | ||
https://pub.dev/packages/provider | https://pub.dev/packages/provider | ||
+ | |||
+ | ==インストール== | ||
+ | pubspec.yaml | ||
+ | <pre> | ||
+ | dependencies: | ||
+ | provider: ^4.0.3 | ||
+ | </pre> | ||
+ | ==package:provider対応前== | ||
+ | <pre> | ||
+ | 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), | ||
+ | ), | ||
+ | ); | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | ==package:provider対応後== | ||
+ | <pre> | ||
+ | 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), | ||
+ | ), | ||
+ | ); | ||
+ | }, | ||
+ | ); | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | ===変更箇所=== | ||
+ | MyHomePage が StatelessWidget になってる。 | ||
+ | counterがcounterStoreのcounterへ | ||
==参考== | ==参考== | ||
https://ja.unflf.com/flutter/provider/ | https://ja.unflf.com/flutter/provider/ |
2020年2月10日 (月) 11:31時点における最新版
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へ