NGHỆ THUẬT FLUTTER : FutureProvider, StreamProvider
1 2 |
// provider: ^4.3.2+2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "users": [ { "name": "Báo Flutter", "job": "Software Engineer", "website": "baoflutter.com" }, { "name": "Thành Công", "job": "Software Engineer", "website": "baoflutter.com" } ] } |
1 2 |
assets: - info.json |
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 |
// User Model class User { final String name, job, website; const User(this.name, this.job, this.website); User.fromJson(Map<String, dynamic> json): this.name = json['name'], this.job = json['job'], this.website = json['website']; Map<String, dynamic> toJson() => { "name": this.name, "job": this.job, "website": this.website }; } // User List Model class UserList { final List<User> users; UserList(this.users); UserList.fromJson(List<dynamic> usersJson) : users = usersJson.map((user) => User.fromJson(user)).toList(); } |
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 |
import 'dart:convert'; import 'package:advanced_provider/FutureProvider/user_model.dart'; import 'package:flutter/services.dart'; class LoadDataFromJson { final String _dataPath = "assets/info.json"; List<User> users; // Load data, convert to List of Model Future<List<User>> loadUserData( ) async { var dataString = await loadAsset(); Map<String, dynamic> jsonUserData = jsonDecode(dataString); users = UserList.fromJson(jsonUserData['users']).users; print('load thành công!' + jsonEncode(users)); return users; } // Load Data from Assets Future<String> loadAsset() async { return await Future.delayed(Duration(seconds: 10), () async { return await rootBundle.loadString(_dataPath); }); } } |
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 |
import 'package:advanced_provider/FutureProvider/user_model.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class FutureProviderPage extends StatelessWidget { @override Widget build(BuildContext context) { var _users = Provider.of<List<User>>(context); return Column( children: <Widget>[ Padding( padding: EdgeInsets.all(10.0), child: Text( 'FutureProvider Example - Load Infor từ file Json' ), ), Expanded( child: _users == null ? Container(child: CupertinoActivityIndicator(radius: 50.0)) : ListView.builder( itemCount: _users.length, itemBuilder: (context, index){ return Container( height: 50, color: Colors.grey[(index*200) % 400], child: Center( child: Text( '${_users[index].name} - ${_users[index].job} | ${_users[index].website}' ) ) ); } ) ) ], ); } } |
1 |
var _users = Provider.of<List<User>>(context); |
1 2 3 4 5 6 |
home: MultiProvider( providers: [ FutureProvider(create: (_) => LoadDataFromJson().loadUserData()), ], child: |
1 2 3 4 5 6 7 |
class NumberStream { Stream<int> intStream() { Duration interval = Duration(seconds: 1); int _count = 0; return Stream<int>.periodic(interval, (int _count) => _count++); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class StreamProviderPage extends StatelessWidget { @override Widget build(BuildContext context) { var _value = Provider.of<int>(context); return Container( child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('StreamProvider - Load giá trị số tăng tự động sau 1s'), SizedBox(height: 150), Text('${_value.toString()}', style: Theme.of(context).textTheme.display1 ) ], ) ) ); } } |
1 |
var _value = Provider.of<int>(context); |
1 2 3 4 5 6 |
home: MultiProvider( providers: [ StreamProvider(create: (_) => NumberStream().intStream(), initialData: 0) ], child: |
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 |
import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'FutureProvider/future_provider_page.dart'; import 'FutureProvider/load_data_from_json.dart'; import 'StreamProvider/number_stream.dart'; import 'StreamProvider/stream_provider_page.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Advance Flutter', theme: ThemeData( primarySwatch: Colors.blue, ), home: MultiProvider( providers: [ FutureProvider(create: (_) => LoadDataFromJson().loadUserData()), StreamProvider(create: (_) => NumberStream().intStream(), initialData: 0) ], child: DefaultTabController( length: 2, child: DefaultTabController( length: 2, child: Scaffold( appBar: AppBar( title: Text("Advanced Provider"), bottom: TabBar( tabs: [ Tab(child: Text("FutureProvider"),), Tab(child: Text("StreamProvider"),), ], ), ), body: TabBarView( children: [ FutureProviderPage(), StreamProviderPage(), ], ), ), ) ) ) ); } } |

StreamProvider
Cho mình hỏi xíu là. lsao có thể stop được cái StreamProvider ạ.
Ví dụ như trên bạn đang làm 1 bài toán là sau 1s thì count++. vậy mình muốn stop nó lại thì làm ntn ạ
thanks