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"}
]
}