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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
| import 'dart:ffi';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'provider', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(title: '主页'), ); } }
class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title;
@override _MyHomePageState createState() => _MyHomePageState(); }
class _MyHomePageState extends State<MyHomePage> { var _counter = 0;
@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Provider( data: _counter, child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Builder(builder: (builder) { return Text( Provider.of(builder).toString(), ); }), Builder(builder: (builder) { return RaisedButton( onPressed: () { _counter++; setState(() {}); }, child: Icon(Icons.add), ); }), ], ), ), changedCallBack: () { return null; }, ), ); } }
class ProviderChangeedNotifier implements Listenable { void notifyListeners() { print('notifyListeners'); }
@override void addListener(listener) { print('addListener'); }
@override void removeListener(listener) { print('removeListener'); } }
class ProviderModel extends ProviderChangeedNotifier { var data = 0;
change<T extends ProviderChangeedNotifier>(params) { data = params; notifyListeners(); } }
typedef ProviderSharedDataChangedCallBack = Future Function();
class Provider<T extends ProviderChangeedNotifier> extends StatefulWidget { Provider({ Key key, @required this.data, this.child, @required this.changedCallBack, }) : super(key: key); final T data; final Widget child; final ProviderSharedDataChangedCallBack changedCallBack;
@override _ProviderState createState() => _ProviderState();
static T of<T extends ProviderChangeedNotifier>(context) { return SharedData.of(context).data; }
static void changeSharedData(data) { } }
class _ProviderState<T extends ProviderChangeedNotifier> extends State<Provider<T>> { @override Widget build(BuildContext context) { return SharedData( data: widget.data, child: widget.child, ); } }
class SharedData<T extends ProviderChangeedNotifier> extends InheritedWidget { SharedData({ Key key, @required this.data, Widget child, }) : super(key: key, child: child); final T data;
@override bool updateShouldNotify(SharedData oldWidget) { if (oldWidget.data == data) { return false; } else { return true; } }
static SharedData of(BuildContext context) { return context.dependOnInheritedWidgetOfExactType(); } }
|