「Flutter/package:provider」の版間の差分
提供: 初心者エンジニアの簡易メモ
(ページの作成:「==参考== https://ja.unflf.com/flutter/provider/」) |
(→package:provider対応後) |
||
| (同じ利用者による、間の5版が非表示) | |||
| 行1: | 行1: | ||
| + | ==package:providerとは== | ||
| + | テストしやすいように状態とロジックを分離したもの。 | ||
| + | (provider と ChangeNotifier) | ||
| + | |||
| + | ==公式== | ||
| + | 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へ
