When i create a list, i can only use it in the class where i created the list. But in another class i get an error 'undefined name' when i want to use the list. How can i get access to the list?
For example in my code i created a list 'plans' with strings.
class _PlanOverviewState extends State<PlanOverview> {
List<String> plans = ['Plan A', 'Plan B'];
void addPlan(String neuerPlan) {
setState(() {
plans.add(neuerPlan);
});
Navigator.of(context).pop();
}
Now I want to output a single string from the list plans in another Widget in the Appbar as title, so the User know where he is.
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(plans[i]))
How can i get access to the list plans?
One option is to create & use an InheritedWidget-style accessor for your State class and then you can access it from any descendant context.
import 'package:flutter/material.dart';
class InheritedWidgetPage extends StatefulWidget {
#override
_InheritedWidgetPageState createState() => _InheritedWidgetPageState();
static _InheritedWidgetPageState of(BuildContext context) =>
context.findAncestorStateOfType<_InheritedWidgetPageState>();
}
class _InheritedWidgetPageState extends State<InheritedWidgetPage> {
List<String> plans = ['Plan A', 'Plan B'];
#override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
#override
Widget build(BuildContext context) {
_InheritedWidgetPageState _state = InheritedWidgetPage.of(context);
return Scaffold(
appBar: AppBar(
title: Text(_state.plans[0]),
),
body: Center(
child: ElevatedButton(
child: Text('Goto ${_state.plans[1]}'),
onPressed: () => Navigator.of(context).push(
MaterialPageRoute(builder: (context) => PlanPage(1))),
),
),
);
}
}
class PlanPage extends StatelessWidget {
final int index;
PlanPage(this.index);
#override
Widget build(BuildContext context) {
_InheritedWidgetPageState _state = InheritedWidgetPage.of(context);
return Scaffold(
appBar: AppBar(
title: Text(_state.plans[index]),
),
body: Center(
child: Text('You are here: ${_state.plans[index]}'),
),
);
}
}
This can be pretty confusing to understand at first, but will make more sense as you get more familiar with Flutter's declarative framework.
For the above example to work, you need to have a MaterialApp ancestor widget, and your State class (where you're holding your plans state object) needs to be its parent. I explain why on a similar question here.
Your other option is to use a State Management package of which there are lots, which can help you simplify access to state objects.
Related
I want to have a textinputfield for the user and when he tips in something and clicks on a button the input should be shown in a list item. The user should also have the option to delete items of the list just like a in and todo app.
Here you can find my code:
Link to Code
So I decided to write this simple program just to freshen up my skills... You can directly copy paste this code and it should work just fine.
I have used the provider package here to make this a bit more professional, as you can't always rely on setState() to update your UI when tasks are added to your list. And also because you will probably be using the provider more often in the future.
I have added comments in the below code to make it easy to understand. However, do not hesitate to clear up any confusions in the comments :)
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:todo/list_provider.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
#override
Widget build(BuildContext context) {
return ChangeNotifierProvider( // This initiates the provider.
create: (context) => TaskProvider(), // Initiating it here makes this provider data available everywhere in the application
child: MaterialApp(
title: 'Flutter Demo',
home: const MyHomePage(),
),
);
}
}
class MyHomePage extends StatelessWidget {
const MyHomePage({Key? key}) : super(key: key);
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Dynamic List'),
),
body: const HomePageBody(), // I pass a separate widget here just to make the code a bit cleaner
floatingActionButton: FloatingActionButton(
onPressed: () => showModalBottomSheet( // This calls a bottom Modal Sheet which pops up while pressing the floating action button
context: context, builder: (context) => const BottomSheet()),// The modal sheet displays the BottomSheet() Widget which I have defined down in this code.
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
// This is where the ListView will be shown
class HomePageBody extends StatelessWidget {
const HomePageBody({Key? key}) : super(key: key);
#override
Widget build(BuildContext context) {
List<String> listOfTasks = Provider.of<TaskProvider>(context).getTasks; // This is where the list is being accessed from the Provider file.
return Container(
padding: const EdgeInsets.all(20),
child: ListView.builder(
itemCount: listOfTasks.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(
listOfTasks[index],
),
);
},
),
);
}
}
// This is the BottomSheet Widget where I decided to take User Input from
class BottomSheet extends StatefulWidget {
const BottomSheet({Key? key}) : super(key: key);
#override
State<BottomSheet> createState() => _BottomSheetState();
}
class _BottomSheetState extends State<BottomSheet> {
String task = ''; // This variable holds the tasks user wants to add
#override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.only(
top: 20,
left: 20,
right: 20,
bottom: MediaQuery.of(context).viewInsets.bottom + 20, // viewInsets.bottom adds padding from the bottom to avoid keyboard overlapping textfield widget
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextFormField(// You can use TextField Widget as well
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
),
),
onChanged: (value) { // This saves the value in the TextField for every character the user types
task = value; // The value in the TextField is referred to by the 'value' variable
},
),
const SizedBox(
height: 10,
),
ElevatedButton(
onPressed: () => saveTask(task),
child: const Text('Save Task'),
),
],
),
);
}
void saveTask(String task) {
Provider.of<TaskProvider>(context, listen: false).addTasks(task); //This is where I am calling the function to add a task to the list.
// The 'addTasks()' function is defined in the provider file which is just below
}
}
Here's the list_provider.dart file that I import in above code:
import 'package:flutter/foundation.dart';
class TaskProvider extends ChangeNotifier { // This is the class where your data exists
// and this is the only place where your data should be manipulated! I explain the reason below...
final List<String> _tasks = [];
List<String> get getTasks { // We use a getter to retrieve the list
return _tasks; // We do that in order to avoid modifications to this list from any outside sources.
}
void addTasks(task) {
_tasks.add(task); // This is simply how you add anything to a list
notifyListeners(); // This is why we use providers. This function notifies all the children widgets
// of the Widget where we initiated our provider (see the parent of MaterialApp Widget in the above code)
// This is why changes to data should be made within this class only as it extends ChangeNotifier,
// which provides us with notifyListeners() method. Which ultimately notifies the widgets that the data has been modified and its time to rebuild the widgets that rely on this data!
}
}
You can copy paste this code, just make sure to add the provider package in your pubspec.yaml file as shown below.
im pretty new to flutter, tried for a while on my own now, but didnt find a solution online or within my own skills.
The problem:
list<Widget>sport = [sport1(name: name1)];
name is the variable I use in the child widget ( a callback if I remember right).
name1is the variable in the parent.
Now I want name to be changed, when I change name1
The problem is, I cant use name1 in list. I cant use any variable in list.
Error: Can't access 'this' in a field initializer to read 'name1'
I dont have any other acces to my child widget sport1 than in the list.
Code:
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
#override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
List<Widget> sport = [sport1(name: name1),];
String name1 = 'Max';
#override
Widget build(BuildContext context) {
return MaterialApp(
home: Container(
child: Scaffold(
body: Center(child: sport[0]),),
),
);
}
}
class sport1 extends StatelessWidget {
String name;
sport1({Key key, this.name}) : super(key: key);
#override
Widget build(BuildContext context) {
return Container(
child: Text('$name does x pushups!'),
);
}
}```
I have 2 separate files in my Flutter application, main.dart and class1.dart
class1.dart is defined in my models/ folder
I am trying to access the List that I created from the SampleWidget class but I am unsure how to do this. IntelliSense wasn't able to find the List I had made from the instance object of SampleWidget.
What I'm trying to achieve is:
AssetImage(SampleWidget.listSampleWidget[0].foo)
class1.dart
class SampleWidget {
final String foo;
final int bar;
SampleWidget({this.foo, this.bar});
}
List<SampleWidget> listSampleWidget = [
SampleWidget(
foo: 'assets/001.png',
bar: 420,
),
];
main.dart is just the default boilerplate code when creating a new Flutter application,
main.dart
import 'package:flutter/material.dart';
import 'package:sandbox1/models/class1.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
#override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
#override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final extSampleClass = SampleWidget();
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
// horizontal).
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
//AssetImage(<pass SampleWidget foo parameter from the List here>),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
How do I reference to the List from the class here? Is something like this even doable or is there a different approach?
AssetImage() cannot be used as a standalone widget. Using Image.asset() worked. I can call the List object directly without having to reference the class apparently.
So the code will look something like:
Image.asset(listSampleWidget[0].foo)
And I got the picture on my test device!
I am trying to achieve a course in AWS to connect Amplify in Flutter. But inside 'Create Authentication Flow', when it adds MaterialPage inside a pages, inside Navigator it doesn't found.
I have this error in the MaterialPage:
The method 'MaterialPage' isn't defined for the type '_MyAuthStateState'. Try correcting the name to the name of an existing method, or defining a method named 'MaterialPage'.
My current code (main.dart):
class MyApp extends StatefulWidget {
#override
State<StatefulWidget> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final _authService = AuthService();
#override
void initState() {
super.initState();
_authService.showLogin();
}
#override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Photo Gallery App',
theme: ThemeData(visualDensity: VisualDensity.adaptivePlatformDensity),
home: StreamBuilder<AuthState>(
// 2
stream: _authService.authStateController.stream,
builder: (context, snapshot) {
// 3
if (snapshot.hasData) {
return Navigator(
pages: [
// 4
// Show Login Page
if (snapshot.data.authFlowStatus == AuthFlowStatus.login)
MaterialPage(
child: LoginPage(
shouldShowSignUp: _authService.showSignUp,
didProvideCredentials:
_authService.loginWithCredentials,
),
),
// 5
// Show Sign Up Page
if (snapshot.data.authFlowStatus == AuthFlowStatus.signUp)
MaterialPage(
child: SignUpPage(
shouldShowLogin: _authService.showLogin,
didProvideCredentials: _authService.signUpWithCredentials,
)),
if (snapshot.data.authFlowStatus ==
AuthFlowStatus.verification)
MaterialPage(
child: VerificationPage(
didProvideVerificationCode:
_authService.verifyCode))
],
onPopPage: (route, result) => route.didPop(result),
);
} else {
// 6
return Container(
alignment: Alignment.center,
child: CircularProgressIndicator(),
);
}
}),
);
}
}
I'm guessing your _authService.showLogin() inside initState is trying to perform some navigation, i.e. showing a Widget. Since MyApp doesn't connect itself to the top level Navigator automatically, you can't access/use Navigator functionality.
A MaterialApp will hook you up the top-level Navigator for you automatically.
class MyApp extends StatelessWidget {
#override
Widget build(BuildContext context) {
// ↓ Make MaterialApp your root widget
return MaterialApp(
title: 'Photo Gallery App',
theme: ThemeData(visualDensity: VisualDensity.adaptivePlatformDensity),
home: MyAuthStatePage(),
)
}
}
class MyAuthStatePage extends StatefulWidget {
#override
State<StatefulWidget> createState() => MyAuthState();
}
class MyAuthState extends State<MyAuthStatePage> {
final _authService = AuthService();
#override
void initState() {
super.initState();
}
#override
Widget build(BuildContext context) {
// TODO: implement build
_authService.showLogin();
}
}
Also, initState prob. isn't the right place to be navigating/showing widgets, rather it's there for preparing state that'll be used by widgets inside the build method.
I'm trying to make a buttomtabbar, where there is a List (Stack) on the first Tap page. Somehow there is this error and I just can't figure out why...
This is my Home file:
class Home extends StatelessWidget {
final AuthService _auth = AuthService();
#override
Widget build(BuildContext context) {
return TabContainerIndexedStack();
}}
This is TabContainerIndexStack():
class TabContainerIndexedStack extends StatefulWidget {
TabContainerIndexedStack({Key key}) : super(key: key);
#override
_TabContainerIndexedStackState createState() =>
_TabContainerIndexedStackState();
}
class _TabContainerIndexedStackState extends State<TabContainerIndexedStack> {
int tabIndex = 0;
List<Widget> listScreens;
#override
void initState() {
super.initState();
listScreens = [
Tab1(),
Tab2(),
Tab3(),
];
}
// #override
// bool get wantKeepAlive =>
// true; //by default it will be null, change it to true.
#override
Widget build(BuildContext context) {
return MaterialApp(
color: Colors.yellow,
home: Scaffold(
body: IndexedStack(index: tabIndex, children: listScreens),
bottomNavigationBar: BottomNavigationBar(
currentIndex: tabIndex,
onTap: (int index) {
setState(() {
tabIndex = index;
});
},
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home),
title: Text('Tab1'),
),
BottomNavigationBarItem(
icon: Icon(Icons.report_problem),
title: Text('Tab2'),
),
BottomNavigationBarItem(
icon: Icon(Icons.settings),
title: Text('Tab3'),
),
]),
backgroundColor: Theme.of(context).primaryColor,
),
);
}
}
This is my first Tab (other ones work!!!)
class Tab1 extends StatefulWidget {
#override
_Tab1State createState() => _Tab1State();
}
class _Tab1State extends State<Tab1> with AutomaticKeepAliveClientMixin<Tab1> {
#override
void initState() {
super.initState();
print('initState Tab1');
}
#override
Widget build(BuildContext context) {
print('build Tab1');
return Scaffold(
appBar: AppBar(
title: Text('Tab1'),
),
body: AuftraegeList()
);
}
#override
bool get wantKeepAlive => true;
}
I think the problem is right there in the "body: AuftraegeList()..." above..
Here is the file AuftraegeList():
class AuftraegeList extends StatefulWidget {
#override
_AuftraegeListState createState() => _AuftraegeListState();
}
class _AuftraegeListState extends State<AuftraegeList> {
#override
Widget build(BuildContext context) {
final auftraege = Provider.of<List<Auftrag>>(context);
return ListView.builder(
itemCount: auftraege.length,
itemBuilder: (context, index){
return AuftragTile(auftrag: auftraege[index]);
},
);
}
}
I hope this is enough to solve my problem. I'm very new to Flutter, so it would be nice, if you can say where EXACTLY I have to change WHAT. Thank you so much!!!
EDIT: Here is the Code of my home.dart, which is the code, which represents the list in my main view.
class Home extends StatelessWidget {
final AuthService _auth = AuthService();
#override
Widget build(BuildContext context) {
return TabContainerIndexedStack();
/*
return StreamProvider<List<Auftrag>>.value(
value: DatabaseService().auftraege,
child: Scaffold(
bottomNavigationBar: btmBar(),
backgroundColor: Colors.blue[50],
appBar: AppBar(
title: Text('Home title'),
backgroundColor: Colors.blue,
elevation: 0.0,
actions: <Widget>[
FlatButton.icon(
icon: Icon(Icons.person),
label: Text('logout'),
onPressed: () async{
await _auth.signOut();
},
)
],
),
body: AuftraegeList(),
),
);
*/
}
}
(Its the part I commented out)
Thanks!!
EDIT (2) !!!
Latest edit:
So my first tap class now looks like this (I changed in the Widget build body [] to databaseService.auftraege after declaring databaseService at first).
class Tab1 extends StatefulWidget {
#override
_Tab1State createState() => _Tab1State();
}
class _Tab1State extends State<Tab1> with AutomaticKeepAliveClientMixin<Tab1> {
// Where should I put this line? Whereever I put this, it gives me errors (already imported services/database.dart)
final DatabaseService databaseService = Provider.of<DatabaseService()>(context);
#override
void initState() {
super.initState();
print('initState Tab1');
}
#override
Widget build(BuildContext context) {
print('build Tab1');
return Scaffold(
appBar: AppBar(
title: Text('Tab1'),
),
body: Provider(
create: (context) => databaseService.auftraege,
child: AuftraegeList(),
)
);
}
#override
bool get wantKeepAlive => true;
}
Maybe its also helpful to show you my services/database
class DatabaseService{
final String uid;
DatabaseService({ this.uid });
// collection reference
final CollectionReference auftraegeCollection = Firestore.instance.collection('auftraege');
Future updateUserData(String title, String info, int price, String user) async{
return await auftraegeCollection.document(uid).setData({
'title' : title,
'info': info,
'price': price,
'user': user,
});
}
List<Auftrag> _auftragListFromSnapshot(QuerySnapshot snapshot){
return snapshot.documents.map((doc){
return Auftrag(
title: doc.data['title']?? '',
info: doc.data['info']?? '',
price: doc.data['price']?? 0,
user: doc.data['user']?? '',
);
}).toList();
}
// get auftraege stream
Stream <List<Auftrag>> get auftraege {
return auftraegeCollection.snapshots()
.map(_auftragListFromSnapshot);
}
}
When leave the code like that, it gives me an error at this line:
final DatabaseService databaseService = Provider.of<DatabaseService()>(context);
in my tab1.dart class. It says "Only static members can be accessed in initializers" under "context" and "error: A comparison expression can't be an operand of another comparison expression" as well as "error: The operator '<' isn't defined for the class 'T Function(BuildContext, {listen: bool})'."
Maybe you know what to do. I think I just put this line at the wrong place.
### EDIT (3) ###
(Exception)
════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following assertion was thrown building _BodyBuilder:
dependOnInheritedWidgetOfExactType>() or dependOnInheritedElement() was called before _Tab1State.initState() completed.
When an inherited widget changes, for example if the value of Theme.of() changes, its dependent widgets are rebuilt. If the dependent widget's reference to the inherited widget is in a constructor or an initState() method, then the rebuilt dependent widget will not reflect the changes in the inherited widget.
Typically references to inherited widgets should occur in widget build() methods. Alternatively, initialization based on inherited widgets can be placed in the didChangeDependencies method, which is called after initState and whenever the dependencies change thereafter.
The relevant error-causing widget was:
Scaffold file:///Users/xxxxxxxxxxxxxxx/AndroidStudioProjects/promi_prototype/lib/screens/home/tab_containter_indexedstack.dart:36:13
When the exception was thrown, this was the stack:
0 StatefulElement.dependOnInheritedElement. (package:flutter/src/widgets/framework.dart:4467:9)
1 StatefulElement.dependOnInheritedElement (package:flutter/src/widgets/framework.dart:4510:6)
2 StatefulElement.inheritFromElement (package:flutter/src/widgets/framework.dart:4458:12)
3 Element.inheritFromWidgetOfExactType (package:flutter/src/widgets/framework.dart:3556:14)
4 Provider.of (package:provider/src/provider.dart:259:19)
It says, the relevant error-causing widget was: tab_containter_indexedstack.dart, I already posted this code at the very beginning of my post. The simulator now only shows the blue background with the tabbar at the bottom. No text at the other tabs (worked before) and no error warning at tab1. Even no headings.
Greetings!! :)
.
.
.
### EDIT (4) ###
Oh my god xD Sorry for not working.. and THANK YOU for still helping!
Lets start my the error message:
The following assertion was thrown building Provider>>(dirty, state:
flutter: _DelegateWidgetState#eb784):
flutter: Tried to use Provider with a subtype of Listenable/Stream (Stream>).
flutter:
flutter: This is likely a mistake, as Provider will not automatically update dependents
flutter: when Stream> is updated. Instead, consider changing Provider for more specific
flutter: implementation that handles the update mechanism, such as:
flutter:
flutter: - ListenableProvider
flutter: - ChangeNotifierProvider
flutter: - ValueListenableProvider
flutter: - StreamProvider
The relevant error-causing widget was:
flutter: Provider>>
flutter: file:///Users/xxxxxxxxxxxx/AndroidStudioProjects/promi_prototype/lib/screens/my_tabs/tab1.dart:33:13
So there still is an issue with the Provider in tab1.dart. My guess was to change the Provider thing in AuftragList() because there I was using it the "old" way like Provider.of>(context), just like you mentioned in the edit 18 hours ago.
This is what I did (Out-commented was before):
class AuftraegeList extends StatefulWidget {
#override
_AuftraegeListState createState() => _AuftraegeListState();
}
class _AuftraegeListState extends State<AuftraegeList> {
DatabaseService databaseService ;
#override
Widget build(BuildContext context) {
databaseService = Provider.of<DatabaseService>(context);
// final auftraege = Provider.of<List<Auftrag>>(context);
return ListView.builder(
// itemCount: auftraege.length,
// itemBuilder: (context, index){
itemCount: databaseService.length, //RED MARK HERE
itemBuilder: (context, index){
return AuftragTile(auftrag: databaseService[index]); //RED MARK HERE
},
);
}
}
I thought this is ok now, but I get red marks under ".lenght" and under "[index]". Compiler sais, that I should create a getter in helpers/database.dart which was what I tried then. But no success. I deleted the getters there then.
Do you have an idea? Is it right to change the Provider thing in the AuftraegeList() even though the Compiler said issue is in tap1.dart?
.
EDIT Since you are not imediately using the value for the Stream provider in the Home class, you can use a Provider instead as follows;
class Home extends StatelessWidget {
final AuthService _auth = AuthService();
#override
Widget build(BuildContext context) {
return Provider(
create: (context) => DatabaseServices(),
child: TabContainerIndexedStack()
);
},
}
Then when you need the list, you have to call a provider of the Service class and not the list
final DatabaseService databaseService = Provider.of<DatabaseService>(context);
Then you can access an instance of the list like
databaseService.auftraege
Edit 1
Assuming you have the provider in the home class, don't need to wrap the provider around AuftraegeList() again. This is what you should do.
class _Tab1State extends State<Tab1> with AutomaticKeepAliveClientMixin<Tab1> {
final DatabaseService databaseService;
#override
void initState() {
databaseService = Provider.of<DatabaseService>(context);
super.initState();
print('initState Tab1');
}
#override
Widget build(BuildContext context) {
print('build Tab1');
return Scaffold(
appBar: AppBar(
title: Text('Tab1'),
),
body:
// The use the list directly in this class where needed like `databaseService.auftraege`
child: AuftraegeList(),
)
);
}
#override
bool get wantKeepAlive => true;
}
Note
In a stateful widget, the BuildContext is available in the initState method and the build method. So you can use BuildContext out of those methods unless you implicitly pass it.
If you need the list in AuftragList() class then get an instance
of the list using Provider.of<DatabaseService>(context)
If you need the list to automatically update when a need item is available you can use a StreamSubscription to listen to need stream and add to the list.
When calling the provider of pass the dataType and not the class. That is Provider.of<DatabaseService>(context) and not Provider.of<DatabaseService()>(context).
Edit 2
Since you are getting a stream for you List, use a steamBuilder to builder your Ui
class AuftraegeList extends StatefulWidget {
#override
_AuftraegeListState createState() => _AuftraegeListState();
}
class _AuftraegeListState extends State<AuftraegeList> {
DatabaseService databaseService ;
#override
Widget build(BuildContext context) {
databaseService = Provider.of<DatabaseService>(context);
// final auftraege = Provider.of<List<Auftrag>>(context);
return StreamBuilder<List<Auftrag>>(
stream: databaseService.auftraege,
builder: (context, snapshot) {
if (snapshot.hasData) {
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index){
return AuftragTile(auftrag: snapshot.data[index]);
}
);
}else if(snapshot.hasError){
return Center(child: Text("An error Errored");
}
return Center(child: CircularProgessIndicator();
},
);
}
}
Hope this works.