the html is stripping < > characters so it's not showing correctly click below to see text file with correct <> characters clic here for text file // // provider with data, future, and stream example // add to pubspec.yaml - provider: 3.1.0 // //////////////// main.dart ////////////////////// import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:provider/provider.dart'; import 'dart:convert'; import 'package:flutter/services.dart' show rootBundle; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: MultiProvider( providers: [ ChangeNotifierProvider(builder: (_) => DataProvider()), FutureProvider(builder: (_) => UserProvider().loadUserData()), StreamProvider(builder: (_) => EventProvider().intStream(), initialData: 0) ], child: DefaultTabController( length: 3, child: DefaultTabController( length: 3, child: Scaffold( appBar: AppBar( title: Text("Provider Demo"), bottom: TabBar( tabs: [ Tab(icon: Icon(Icons.add)), Tab(icon: Icon(Icons.person)), Tab(icon: Icon(Icons.message)), ], ), ), body: TabBarView( children: [ MyCountPage(), MyUserPage(), MyEventPage(), ],),),))));}} // Event page (counting) class MyEventPage extends StatelessWidget { @override Widget build(BuildContext context) { var _value = Provider.of(context); return Container( child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('StreamProvider Example'), SizedBox(height: 150), Text('${_value.toString()}', style: Theme.of(context).textTheme.display1 )],)));}} // User List Page class MyUserPage extends StatelessWidget { @override Widget build(BuildContext context) { var _users = Provider.of>(context); return Column( children: [ Padding( padding: EdgeInsets.all(10.0), child: Text( 'FutureProvider Example, users loaded from a File' ), ), 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].firstName} ${_users[index].lastName} | ${_users[index].website}' )));}))],);}} // Counter Page class MyCountPage extends StatelessWidget { @override Widget build(BuildContext context) { DataProvider _data = Provider.of(context); return Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('ChangeNotifierProvider Example'), SizedBox(height: 150), Text( '${_data.count}', style: Theme.of(context).textTheme.display1,),],),), floatingActionButton: FloatingActionButton( onPressed: () => _data.incrementCount(), tooltip: 'Increment', child: Icon(Icons.add),),);}} // EventProvider (Stream) class EventProvider { Stream intStream() { Duration interval = Duration(seconds: 2); int _count = 0; return Stream.periodic(interval, (int _count) => _count++);}} // UserProvider (Future) class UserProvider { final String _dataPath = "assets/users.json"; List users; Future> loadUserData( ) async { var dataString = await loadAsset(); Map jsonUserData = jsonDecode(dataString); users = UserList.fromJson(jsonUserData['users']).users; print('done loading user!' + jsonEncode(users)); return users; } Future loadAsset() async { return await Future.delayed(Duration(seconds: 10), () async { return await rootBundle.loadString(_dataPath); });}} // DataProvider (ChangeNotifier) class DataProvider extends ChangeNotifier { int _count = 0; int get count => _count; DataProvider(); void incrementCount(){ _count++; notifyListeners();}} // User Model class User { final String firstName, lastName, website; const User(this.firstName, this.lastName, this.website); User.fromJson(Map json): this.firstName = json['first_name'], this.lastName = json['last_name'], this.website = json['website']; Map toJson() => { "first_name": this.firstName, "last_name": this.lastName, "website": this.website};} // User List Model class UserList { final List users; UserList(this.users); UserList.fromJson(List usersJson) : users = usersJson.map((user) => User.fromJson(user)).toList();} /////////////// assets/users.json ////////////// { "users": [ {"first_name": "Douglas", "last_name": "Tober", "website": "Codetober.com"}, {"first_name": "Brad", "last_name": "Traversy", "website": "traversymedia.com"}, {"first_name": "Bucky", "last_name": "Roberts", "website": "lhventures.us"}, {"first_name": "Doug", "last_name": "Tober", "website": "j5technology.com"} ] }