Provider 模块
添加依赖
1 2
| dependencies: provider: ^4.3.2+4
|
MultiProvider
对多个 Provider 整理
Provider
最基础的 provider 组成,接收一个值并暴露它, 无论值是什么。但是不是会 ui 上刷新
生成 model
1 2 3 4 5 6 7 8 9 10
| class CountModel { int count = 0; add() { this.count++; print(this.count); } }
|
main.dart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| import 'package:FlutterProvider/model/CountModel.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart';
main() { runApp( Provider<CountModel>( create: (_) { return CountModel(0); }, child: MyApp(), ), ); }
class MyApp extends StatelessWidget { const MyApp({Key key}) : super(key: key);
@override Widget build(BuildContext context) { return MaterialApp( title: "Provider", home: HomePage(), ); } }
class HomePage extends StatelessWidget { const HomePage({Key key}) : super(key: key);
@override Widget build(BuildContext context) { CountModel count = Provider.of<CountModel>(context); return Scaffold( appBar: AppBar( title: Text("Flutter Provider"), ), body: Center( child: Text("当前的值:${count.count.toString()}"), ), floatingActionButton: FloatingActionButton( onPressed: () { count.add(); }, child: Icon(Icons.add), ), ); } }
|
ChangeNotifierProvider(常用)
为 ChangeNotifier 提供的 ListenableProvider 规范,会在需要时自动调用ChangeNotifier.dispose
。
CountModel.dart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import 'package:flutter/foundation.dart';
class CountModel with ChangeNotifier { int count; CountModel(this.count); add() { this.count++; print(this.count); notifyListeners(); } }
|
MultiProvide
当在大型应用中注入较多状态时, Provider
很容易变得高度耦合
嵌套写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| main() { runApp( ChangeNotifierProvider<FristModel>( create: (BuildContext context) { return FristModel("Rm"); }, child: ChangeNotifierProvider<CountModel>( create: (_) { return CountModel(0); }, child: MyApp(), ), ), ); }
|
MultiProvider
1 2 3 4 5 6 7 8 9
| main() { runApp(MultiProvider( providers: [ ChangeNotifierProvider<CountModel>(create: (_) => CountModel(0)), ChangeNotifierProvider<FristModel>(create: (_) => FristModel("Rm")), ], child: MyApp(), )); }
|