「Flutter/package:provider」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→package:provider対応後) |
|||
(同じ利用者による、間の1版が非表示) | |||
行11: | 行11: | ||
dependencies: | dependencies: | ||
provider: ^4.0.3 | 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> | </pre> | ||
==package:provider対応後== | ==package:provider対応後== | ||
行16: | 行75: | ||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||
import 'package:provider/provider.dart'; | import 'package:provider/provider.dart'; | ||
− | |||
class CounterStore with ChangeNotifier { | class CounterStore with ChangeNotifier { | ||
var counter = 0; | var counter = 0; | ||
行24: | 行82: | ||
} | } | ||
} | } | ||
− | |||
void main() => runApp(MyApp()); | void main() => runApp(MyApp()); | ||
− | |||
class MyApp extends StatelessWidget { | class MyApp extends StatelessWidget { | ||
@override | @override | ||
行42: | 行98: | ||
} | } | ||
} | } | ||
− | |||
class MyHomePage extends StatelessWidget { | class MyHomePage extends StatelessWidget { | ||
MyHomePage({Key key, this.title}) : super(key: key); | MyHomePage({Key key, this.title}) : super(key: key); | ||
− | |||
final String title; | final String title; | ||
− | |||
@override | @override | ||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||
行81: | 行134: | ||
} | } | ||
</pre> | </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へ