I have the following code and I am trying to add two more hexagons gradually in the scene(after 1 second each one) when I click the first hexagon. I have tried the Thread.sleep(1000) but the hexagons appear at the same time(when the code is complete).
Can you help me?
Thank you in advanced!
import java.io.IOException;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.event.Event;
import javafx.scene.Cursor;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Polygon;
import javafx.stage.Stage;
public class Hexagons extends Application {
Group root;
Scene scene1;
Polygon polygon;
Polygon polygon2;
Polygon polygon3;
public static void main(String[] args) {
launch(args);
}
#Override
public void start(Stage primaryStage) throws IOException {
root = new Group();
scene1 = new Scene(root, 1000, 1000);
scene1.setCursor(Cursor.HAND);
polygon = new Polygon();
polygon.setLayoutY(50);
polygon2 = new Polygon();
polygon2.setLayoutY(50);
polygon3 = new Polygon();
polygon3.setLayoutY(50);
polygon.setFill(Color.TRANSPARENT);
polygon.setStroke(Color.BLUE);
polygon2.setFill(Color.TRANSPARENT);
polygon2.setStroke(Color.BLUE);
polygon3.setFill(Color.TRANSPARENT);
polygon3.setStroke(Color.BLUE);
root.getChildren().add(polygon);
Double[] polygonElements;
Double[] polygon2Elements;
Double[] polygon3Elements;
polygonElements = new Double[]{
100.0, 100.0,
50.0, 75.0,
50.0, 25.0,
100.0, 0.0,
150.0, 25.0,
150.0, 75.0};
polygon2Elements = new Double[]{
110.0, 100.0,
60.0, 65.0,
60.0, 15.0,
110.0, -10.0,
160.0, 15.0,
160.0, 65.0};
polygon3Elements = new Double[]{
120.0, 100.0,
70.0, 65.0,
70.0, 15.0,
120.0, -10.0,
170.0, 15.0,
170.0, 65.0};
polygon.getPoints().addAll(polygonElements);
polygon2.getPoints().addAll(polygon2Elements);
polygon3.getPoints().addAll(polygon3Elements);
polygon.setOnMouseClicked((Event event) -> {
root.getChildren().add(polygon2);
root.getChildren().add(polygon3);
});
primaryStage.setScene(scene1);
primaryStage.show();
}
Use a Transition like this:
package com.isp.stackoverflow;
import java.io.IOException;
import javafx.animation.FadeTransition;
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.scene.Cursor;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Polygon;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Hexagons extends Application
{
public static void main( String[] args )
{
launch( args );
}
#Override public void start( Stage primaryStage ) throws IOException
{
final Group root = new Group();
final ObservableList<Node> rootChildren = root.getChildren();
final Scene scene = new Scene( root, 1000, 1000 );
scene.setCursor( Cursor.HAND );
final Polygon polygon = createPolygon(100.0, 100.0, 50.0, 75.0, 50.0, 25.0, 100.0, 0.0, 150.0, 25.0, 150.0, 75.0);
rootChildren.add( polygon );
polygon.setOnMouseClicked( ( Event event ) -> {
final Polygon polygon2 = createPolygon( 110.0, 100.0, 60.0, 65.0, 60.0, 15.0, 110.0, -10.0, 160.0, 15.0, 160.0, 65.0 );
final Polygon polygon3 = createPolygon( 120.0, 100.0, 70.0, 65.0, 70.0, 15.0, 120.0, -10.0, 170.0, 15.0, 170.0, 65.0 );
//remove all except first polygon
rootChildren.retainAll( polygon );
rootChildren.add( polygon2 );
rootChildren.add( polygon3 );
fadeIn( polygon2 );
fadeIn( polygon3 );
} );
primaryStage.setScene( scene );
primaryStage.show();
}
private static void fadeIn( final Node node )
{
final FadeTransition fade = new FadeTransition( Duration.millis( 200 ) );
fade.setNode( node );
fade.setFromValue( 0.0 );
fade.setToValue( 1.0 );
fade.play();
}
private static Polygon createPolygon( double... points )
{
final Polygon polygon = new Polygon( points );
polygon.setLayoutY( 50 );
polygon.setFill( Color.TRANSPARENT );
polygon.setStroke( Color.BLUE );
return polygon;
}
}
Related
Here the StreamProvider is giving this error
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:location/location.dart';
import 'package:milk_groceries_delivery_app/models/categorywise/product_catrgory_list_model.dart';
import 'package:milk_groceries_delivery_app/models/milk_product_model.dart';
import 'package:milk_groceries_delivery_app/models/milk_quantity_list_model.dart';
import 'package:milk_groceries_delivery_app/models/user_info_model.dart';
import 'package:milk_groceries_delivery_app/services/authentication_services/authentication_service.dart';
import 'package:milk_groceries_delivery_app/services/database_services/database_service.dart';
import 'package:milk_groceries_delivery_app/services/location_services.dart';
import 'package:milk_groceries_delivery_app/services/shared_preference_service.dart';
import 'package:milk_groceries_delivery_app/wrapper.dart';
import 'package:provider/provider.dart';
import 'package:flutter_phoenix/flutter_phoenix.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
SystemChrome.setPreferredOrientations(
[
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
],
);
SharedPreferenceServices.settingPreference();
runApp(Phoenix(child: const MyApp()));
await LocationServices().checkingServiceAvailability();
await LocationServices().gettingPermission();
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
#override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Location location = Location();
LocationData? locationData;
_MyAppState() {
getttingLocData().then((val) {
setState(() {
locationData = val;
});
});
}
getttingLocData() async {
return await location.getLocation();
}
#override
Widget build(BuildContext context) {
Connectivity connectivity = Connectivity();
ConnectivityResult connectivityResult = ConnectivityResult.none;
Fluttertoast.showToast(msg: '$locationData');
print(connectivityResult.toString());
return MultiProvider(
providers: [
StreamProvider<User?>.value(
value: AuthServices().userLoginStream,
initialData: null,
),
StreamProvider<List<ProductDairyCategoryListModel>>.value(
value: DatabaseServices(category: "").ProductCategoryListStream,
initialData: [],
),
StreamProvider<UserInfoModel?>.value(
value: DatabaseServices().cartDetailsStream,
initialData: null,
),
StreamProvider.value(
value: location.onLocationChanged,
initialData: locationData,
),
StreamProvider<MilkQuantityListModel?>.value(
value: DatabaseServices().listOfMilkQuantityStream,
initialData: null,
),
StreamProvider<MilkProductModel?>.value(
value: DatabaseServices().milkProductStream,
initialData: null)
],
child: MaterialApp(
theme: ThemeData(
buttonTheme: ButtonThemeData(
buttonColor: Colors.green,
),
iconTheme: IconThemeData(
color: Colors.blue.withOpacity(0.5),
opacity: 1,
size: 16,
),
),
home: Wrapper(),
),
);
}
}
This is the screen where I am reading the data. where I am getting null.
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:milk_groceries_delivery_app/models/milk_product_model.dart';
import 'package:milk_groceries_delivery_app/models/user_info_model.dart';
import 'package:milk_groceries_delivery_app/screens/home_screen.dart';
import 'package:milk_groceries_delivery_app/screens/milk_screen.dart';
import 'package:milk_groceries_delivery_app/screens/order_history_screen.dart';
import 'package:milk_groceries_delivery_app/screens/profile_screen.dart';
import 'package:milk_groceries_delivery_app/screens/search_screen.dart';
import 'package:provider/provider.dart';
class Tabs extends StatefulWidget {
const Tabs({Key? key}) : super(key: key);
#override
_TabsState createState() => _TabsState();
}
class _TabsState extends State<Tabs> with SingleTickerProviderStateMixin {
late TabController _tabsController;
MilkProductModel? listOfFuturesOfDocumentRef;
UserInfoModel? userInfoModel;
#override
void initState() {
// TODO: implement initState
super.initState();
_tabsController = TabController(length: 4, vsync: this);
_tabsController.addListener(() {
setState(() {});
});
}
#override
Widget build(BuildContext context) {
double heightScreen = MediaQuery.of(context).size.height;
double widthScreen = MediaQuery.of(context).size.width;
listOfFuturesOfDocumentRef = Provider.of<MilkProductModel?>(context);
userInfoModel = Provider.of<UserInfoModel?>(context);
print(listOfFuturesOfDocumentRef?.listOfDocumentReference);
print(userInfoModel?.cart);
return DefaultTabController(
length: 4,
child: Scaffold(
body: TabBarView(
controller: _tabsController,
children: [
HomeScreen(),
SearchScreen(),
OrderHistoryScreen(),
ProfileScreen(),
],
),
bottomNavigationBar: Container(
height: 0.07 * heightScreen,
child: BottomAppBar(
shape: CircularNotchedRectangle(),
child: TabBar(
unselectedLabelColor: Colors.green,
indicatorColor: Colors.green,
labelColor: Colors.green,
controller: _tabsController,
tabs: [
Icon(
Icons.home,
color:
_tabsController.index == 0 ? Colors.green : Colors.grey,
),
Icon(
Icons.shopping_bag,
color:
_tabsController.index == 1 ? Colors.green : Colors.grey,
),
Icon(
Icons.update_sharp,
color:
_tabsController.index == 2 ? Colors.green : Colors.grey,
),
Icon(
Icons.person,
color:
_tabsController.index == 3 ? Colors.green : Colors.grey,
),
],
),
),
),
floatingActionButton: FloatingActionButton(
elevation: 0.0,
backgroundColor: Colors.green,
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MilkScreen(),
),
);
},
child: Text(
'Milk',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 18,
),
),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
),
);
}
}
This is the UserInfoModel which i defined.
import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
class UserInfoModel {
GeoPoint? location;
List? cart;
List? orders;
// String? name;
List? address;
String? phonenumber;
String? email;
List<dynamic> listOfMilkQuantity;
String? profileImageUrl;
UserInfoModel({
required this.cart,
required this.location,
required this.orders,
this.address,
this.email,
// this.name,
this.phonenumber,
required this.listOfMilkQuantity,
required this.profileImageUrl,
});
}
The stream gives null value and then works perfect once I hot reload or restart. I don't know why that's the case. Is there any other alternative for doing this?
Your help is highly appreciated. Thankyou in advance.
Here is a great example on how to work with Stream and StreamProvider
Also see this question: How to create a StreamProvider and subscribe to it later, Flutter
Try to use StreamaProvider default constructor and put your stream into the create field, like described in the linked article. Instead of the StreamProvider.value constructor.
StreamProvider<SettingsDataModel>(
create: (context) => Globals.firebaseCaller.settings(),
),
And just a hint: Use extension functions. You can simply use: context.watch<T>() instead of Provider.of<T>(context)
And you can also write your own extensions, so you can use context.height instead of MediaQuery.of(context).size.height.
I am creating a system that only certain user can see the list of the projects. The list of the projects will be shown in user application when the projects have been assigned to them thru administration by using user's email. I am using flutter and google firebase
I tried to use If else statement but I seem can't do it.
I have 2 model classes
User_model class
import 'package:firebase_auth/firebase_auth.dart';
class Users{
final String uid;
Users({this.uid});
}
class UserModel{
String uid;
String email;
String name;
String employeeID;
String phonenumber;
String position;
UserModel({this.uid, this.email, this.name, this.employeeID, this.phonenumber, this.position});
//receiving data from server
factory UserModel.fromMap(map){
return UserModel(
uid: map['uid'],
email: map['email'],
name: map['name'],
employeeID: map['employeeID'],
phonenumber: map['phonenumber'],
position: map['position'],
);
}
//sending data to our server
Map<String, dynamic> toMap(){
return{
'uid': uid,
'email': email,
'name' : name,
'employeeID' : employeeID,
'phonenumber' : phonenumber,
'position' : position,
};
}
}
class UserProject{
final String projectid;
final String address;
final String titleproject;
final List<String> assignedmember ;
UserProject({this.projectid, this.address, this.titleproject, this.assignedmember});
}
Project_model class
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
class Project{
final String address;
final String titleproject;
final List<dynamic> assignedmember;
Project({this.address, this.titleproject, this.assignedmember});
}
HomeScreen.dart
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:smartconstructionreport/data/project_model.dart';
import 'package:smartconstructionreport/data/user_model.dart';
import 'package:smartconstructionreport/screens/project_screen.dart';
import 'package:smartconstructionreport/theme.dart';
import 'package:smartconstructionreport/widget/ProjectCard.dart';
import 'package:smartconstructionreport/widget/menulist.dart';
import 'package:smartconstructionreport/service/database.dart';
import 'package:provider/provider.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:smartconstructionreport/widget/projectlist.dart';
import 'FloorPlan.dart';
class HomeScreen extends StatefulWidget {
#override
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
User user = FirebaseAuth.instance.currentUser;
UserModel loggedInUser = UserModel();
#override
void initState(){
super.initState();
FirebaseFirestore.instance
.collection("user")
.doc(user.uid)
.get()
.then((value){
this.loggedInUser = UserModel.fromMap(value.data());
setState(() {});
});
}
Widget build(BuildContext context) {
return StreamProvider<List<Project>>.value(
value: DatabaseService().projects,
child: Scaffold(
drawer: menulist(),
appBar: AppBar(
backgroundColor: kPrimaryColor,
centerTitle: true,
title: Image.asset('images/scdr logo.png',
fit: BoxFit.cover,),
),
body: SingleChildScrollView(
child: Padding(
padding: kDefaultPadding,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 30,
),
Text(
"Hello ${loggedInUser.name},",
style: TextStyle(color: Colors.black,
fontSize: 25,
fontWeight: FontWeight.w700),
),
SizedBox(
height: 5,
),
Text(
'Have a great day ahead!',
style: TextStyle(color: Colors.black,
fontSize: 12,
),
),
SizedBox(
height: 5,
),
Text(
'Lets start working!',
style: TextStyle(color: Colors.black,
fontSize: 12,
),
),
SizedBox(
height: 30,
),
Text(
'Project Lists',
style: TextStyle(color: Colors.black,
fontSize: 25,
fontWeight: FontWeight.w700),
),
SizedBox(
height: 18,
),
ProjectList(),
],
),
),
),
),
);
}
}
ProjectList.dart
I tried to add If else statement to check if the project contains email assigned to the project. But it return null
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:provider/provider.dart';
import 'package:smartconstructionreport/data/project_model.dart';
import 'package:smartconstructionreport/screens/project_screen.dart';
import 'ProjectCard.dart';
class ProjectList extends StatefulWidget {
#override
_ProjectListState createState() => _ProjectListState();
}
class _ProjectListState extends State<ProjectList> {
User user = FirebaseAuth.instance.currentUser;
Project projectmember = Project();
#override
Widget build(BuildContext context) {
final projects = Provider.of<List<Project>>(context) ?? [];
return ListView.builder(
shrinkWrap: true,
itemCount: projects.length,
itemBuilder: (context, index) {
if (projectmember.assignedmember.contains(user.email)) {
return ProjectCard(project: projects[index],
press: () {
Navigator.push(context, MaterialPageRoute(
builder: (context) => ProjectScreen(),
));
},
);
};
}
);
}
}
ProjectCard.dart
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:smartconstructionreport/data/project_model.dart';
import 'package:smartconstructionreport/theme.dart';
class ProjectCard extends StatelessWidget {
final Function press;
final Project project;
ProjectCard({this.project, this.press});
#override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return GestureDetector(
onTap: press,
child: Card(
clipBehavior: Clip.antiAlias,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20.0)
),
elevation: 10,
margin: EdgeInsets.fromLTRB(5.0, 15.0, 5.0, 10.0),
child: Column(
children: [
Stack(
alignment: Alignment.center,
children: [
Padding(
padding: const EdgeInsets.all(2.0),
child: Text(
project.titleproject,
style: TextStyle(
fontSize: 17,
fontWeight: FontWeight.bold,
),
),
)
],
),
Divider(color: Colors.black),
Padding(
padding: EdgeInsets.fromLTRB(10.0, 5.0, 5.0, 0.0),
child: Text(
project.address,
style: TextStyle(fontSize: 14),),
),
Row(
children: [
Column(
children: [
TextButton.icon(
onPressed: (){},
icon: Icon(Icons.person,
color: kPrimaryColor,) ,
label: Text('Project Manager')),
],
),
SizedBox(width:50),
Column(
children: [
TextButton.icon(
onPressed: (){},
icon: Icon(Icons.location_pin,
color: kPrimaryColor,) ,
label: Text('MAP')),
],
)
],
),
],
),
),
);
}
}
Error
======== Exception caught by widgets library =======================================================
The method 'contains' was called on null.
Receiver: null
Tried calling: contains("rashid#fyp.com")
====================================================================================================
import 'package:flutter/material.dart';
import 'package:geoflutterfire/geoflutterfire.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:geocoding/geocoding.dart';
import 'package:cloud_functions/cloud_functions.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:geolocator/geolocator.dart';
class HomePage extends StatefulWidget {
const HomePage({Key key}) : super(key: key);
#override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
//final firestoreInstance = FirebaseFirestore.instance;
final geo = Geoflutterfire();
GeoFirePoint myLocation;
LatLng _initialPosition = LatLng(13, 77.583333);
GoogleMapController _controller;
Stream<List<DocumentSnapshot>> stream;
var _location;
String searchAddress;
List<Marker> markers1 = [];
Map<MarkerId, Marker> markers = <MarkerId, Marker>{};
BitmapDescriptor pinLocationIcon;
void _onMapCreated(GoogleMapController _contrl) {
_controller = _contrl;
/*stream.listen((List<DocumentSnapshot> documentList) {
_updateMarkers(documentList);
});*/
_location.onLocationChanged.listen((l) {
_controller.animateCamera(
CameraUpdate.newCameraPosition(
CameraPosition(target: LatLng(l.latitude, l.longitude), zoom: 15),
),
);
});
}
#override
void initState() {
// TODO: implement initState
populateClients();
super.initState();
}
populateClients() {
FirebaseFirestore.instance.collection('markers').get().then((docs) {
if (docs.docs.isNotEmpty) {
for (int i = 0; i < docs.docs.length; ++i) {
initMarker(docs.docs[i].data(), docs.docs[i].id);
}
}
});
}
void initMarker(request, requestId) {
var markerIdVal = requestId;
final MarkerId markerId = MarkerId(markerIdVal);
final Marker marker = Marker(
markerId: markerId,
position:
LatLng(request['location'].latitude, request['location'].longitude),
icon: pinLocationIcon,
);
setState(() {
markers[markerId] = marker;
});
}
#override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: <Widget>[
GoogleMap(
initialCameraPosition:
CameraPosition(target: _initialPosition, zoom: 10),
onMapCreated: _onMapCreated,
myLocationEnabled: true,
markers: Set<Marker>.of(markers.values),
),
Positioned(
top: 30.0,
right: 15.0,
left: 15.0,
child: Container(
height: 50.0,
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.0),
color: Colors.white,
),
child: TextField(
decoration: InputDecoration(
hintText: 'Enter Address',
border: InputBorder.none,
contentPadding: EdgeInsets.only(left: 15.0, top: 15.0),
suffixIcon: IconButton(
icon: Icon(Icons.search),
onPressed: searchAndNavigate,
iconSize: 20,
),
),
onChanged: (val) {
setState(() {
searchAddress = val;
});
},
),
),
),
searchAndNavigate() {
locationFromAddress(searchAddress).then((result) {
myLocation = geo.point(
latitude: result[0].latitude, longitude: result[0].longitude);
double lat = result[0].latitude;
double lng = result[0].longitude;
var _marker = Marker(
markerId: MarkerId(UniqueKey().toString()),
position: LatLng(lat, lng),
icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueViolet),
);
setState(() {
markers1.add(_marker);
});
_controller.animateCamera(CameraUpdate.newCameraPosition(CameraPosition(
target: LatLng(result[0].latitude, result[0].longitude),
zoom: 10,
)));
});
}
}
This is part of the code responsible for pulling markers from firebase onto my google maps.
The whole code allows users to create markers and store them onto firebase, but when I try to implement this I get the error as mentioned in the question.
For reference, I was using-
https://medium.com/flutter-community/google-maps-in-flutter-ii-260f43db5924,
How to retrive my markers from Firestore to Google Map?
I have having some issues in a Firebase login. I'm trying to make with Provider.The problem is that my login is not refreshing the UI, even thought the data changes and when i hit hot restart it shows me the new UI. Doing some experiments I got into the conclusion that the problem is on a Navigator.push i use to show an animation. I don't wanna lose this animation it gives a pretty cool style to my an app. Is there any way the main provider can can work after a new page is push?
Main.dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:lyric_hero/app_localizations.dart';
import 'package:lyric_hero/blocs/unlogged_bloc.dart';
import 'package:lyric_hero/blocs/userrepository_bloc.dart';
import 'package:lyric_hero/pages/LoggedPage.dart';
import 'package:lyric_hero/pages/SplashScreenPage.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:lyric_hero/pages/UnloggedPage.dart';
import 'package:lyric_hero/widgets/Unlogged/LoginForm.dart';
import 'package:provider/provider.dart';
void main() {
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
systemNavigationBarColor: Colors.black,
statusBarColor: Colors.transparent,
statusBarIconBrightness: Brightness.dark));
return runApp(MyApp());
}
class MyApp extends StatefulWidget {
#override
State<StatefulWidget> createState() {
return _MyAppState();
}
}
class _MyAppState extends State<MyApp> {
#override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Lyric Hero',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomePage(),
supportedLocales: [
Locale('en', 'US'),
Locale('es', 'ES'),
Locale('pt', 'BR')
],
localizationsDelegates: [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate
],
localeResolutionCallback: (locale, supportedLocales) {
for (var supportedLocale in supportedLocales) {
if (supportedLocale.languageCode == locale?.languageCode) {
return supportedLocale;
}
}
return supportedLocales.first;
},
);
}
}
class HomePage extends StatelessWidget {
#override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => UserRepository.instance(),
child: Consumer(
builder: (context, UserRepository user, _) {
switch (user.status) {
case Status.Uninitialized:
return SplashScreenPage();
case Status.Unauthenticated:
case Status.Authenticating:
return UnloggedPage();
case Status.Authenticated:
return LoggedPage();
}
},
),
);
}
}
UnloggedPage.dart
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:lyric_hero/blocs/userrepository_bloc.dart';
import 'package:lyric_hero/widgets/AppTitle.dart';
import 'package:lyric_hero/widgets/Unlogged/BottomMessage.dart';
import 'package:lyric_hero/widgets/Unlogged/LoginForm.dart';
import 'package:lyric_hero/widgets/Unlogged/RegisterForm.dart';
import 'package:lyric_hero/widgets/gradients/BluePurpleGradient.dart';
import 'package:provider/provider.dart';
import 'package:responsive_widgets/responsive_widgets.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:page_transition/page_transition.dart';
class UnloggedPage extends StatefulWidget {
#override
State<StatefulWidget> createState() {
return _UnloggedPageState();
}
}
class _UnloggedPageState extends State<UnloggedPage> {
#override
void initState() {
new Timer(Duration(seconds: 1), () {
Navigator.push(
context,
PageTransition(
type: PageTransitionType.rightToLeft, child: UnloggedForms()));
});
super.initState();
}
#override
Widget build(BuildContext context) {
ResponsiveWidgets().init(context,
referenceHeight: 1920, // Optional
referenceWidth: 1080, // Optional
referenceShortestSide: 411 // Optional, default = 360
);
return Scaffold(
body: BlueGreenGradient(
child: Center(
child: AppTitle(
type: 'white',
),
),
),
);
}
}
class UnloggedForms extends StatefulWidget {
#override
State<StatefulWidget> createState() {
return _UnloggedFormsState();
}
}
class _UnloggedFormsState extends State<UnloggedForms> {
Widget _root = LoginForm();
Alignment _alignment = Alignment.center;
double _paddingbottom = 40;
double _paddingtop = 0;
bool _show = false;
bool _login = true;
Widget horizontalLine() => Padding(
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Container(
width: ScreenUtil.getInstance().setWidth(120),
height: 1.0,
color: Colors.black26.withOpacity(.2),
),
);
#override
Widget build(BuildContext context) {
Timer(Duration(seconds: 2), () {
setState(() {
_paddingbottom = 50;
_paddingtop = 50;
_alignment = Alignment.topCenter;
});
/*
unloggedBloc.setPaddingBottom(50);
unloggedBloc.setPaddingTop(50);
unloggedBloc.setAlignment(Alignment.topCenter);*/
});
ResponsiveWidgets().init(context,
referenceHeight: 1920, // Optional
referenceWidth: 1080, // Optional
referenceShortestSide: 411 // Optional, default = 360
);
return Container(
color: Colors.white,
child: SafeArea(
child: Scaffold(
body: Container(
color: Colors.white,
child: AnimatedContainer(
duration: Duration(milliseconds: 400),
onEnd: () {
Timer(Duration(milliseconds: 400), () {
setState(() {
_show = true;
});
//unloggedBloc.setShow();
});
},
alignment: _alignment,
child: SingleChildScrollView(
padding: EdgeInsetsResponsive.only(
top: _paddingtop, bottom: _paddingbottom),
child: Column(children: <Widget>[
AppTitle(
type: 'main-gradient',
),
Visibility(
visible: _show,
child: Column(
children: <Widget>[
_root,
BottomMessagge(
login: _login,
action: () {
if (_login) {
setState(() {
_root = RegisterForm();
});
/*unloggedBloc
.setRoot(RegisterForm());*/
} else {
setState(() {
_root = LoginForm();
});
//unloggedBloc.setRoot(LoginForm());
}
setState(() {
_login = !_login;
});
//unloggedBloc.setLogin();
},
)
],
))
])))))));
}
}
LoginForm.dart
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:lyric_hero/app_localizations.dart';
import 'package:lyric_hero/blocs/userrepository_bloc.dart';
import 'package:lyric_hero/widgets/CustomizedButton.dart';
import 'package:provider/provider.dart';
import 'package:responsive_widgets/responsive_widgets.dart';
import 'package:gradient_widgets/gradient_widgets.dart';
import 'package:responsive_widgets/responsive_widgets.dart';
import 'package:flutter_signin_button/flutter_signin_button.dart';
class LoginForm extends StatefulWidget {
#override
State<StatefulWidget> createState() {
return _LoginFormState();
}
}
class _LoginFormState extends State<LoginForm> {
TextEditingController _email;
TextEditingController _password;
double _formheight = 550.0;
final _formKey = GlobalKey<FormState>();
Widget horizontalLine() => Padding(
padding: EdgeInsets.symmetric(horizontal: 16.0),
child: Container(
width: ScreenUtil.getInstance().setWidth(120),
height: 1.0,
color: Colors.black26.withOpacity(.2),
),
);
#override
void initState() {
_email = TextEditingController(text: "");
_password = TextEditingController(text: "");
super.initState();
}
#override
Widget build(BuildContext context) {
final user = Provider.of<UserRepository>(context);
ResponsiveWidgets().init(context,
referenceHeight: 1920, // Optional
referenceWidth: 1080, // Optional
referenceShortestSide: 411 // Optional, default = 360
);
ScreenUtil.instance = ScreenUtil.getInstance()..init(context);
ScreenUtil.instance =
ScreenUtil(width: 750, height: 1334, allowFontScaling: true);
return Padding(
padding: EdgeInsetsResponsive.only(top: 30, right: 20, left: 20),
child: Column(children: <Widget>[
ContainerResponsive(
width: double.infinity,
height: _formheight,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8.0),
boxShadow: [
BoxShadow(
color: Colors.black12,
offset: Offset(0.0, 15.0),
blurRadius: 15.0),
BoxShadow(
color: Colors.black12,
offset: Offset(0.0, -10.0),
blurRadius: 10.0),
]),
child: Padding(
padding: EdgeInsets.only(left: 16.0, right: 16.0, top: 16.0),
child: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(AppLocalizations.of(context).translate('signin-title'),
style: TextStyle(
fontSize: ScreenUtil.getInstance().setSp(45),
fontFamily: "Poppins-Bold",
letterSpacing: .6)),
SizedBox(
height: ScreenUtil.getInstance().setHeight(30),
),
Text(AppLocalizations.of(context).translate('email'),
style: TextStyle(
fontFamily: "Poppins-Medium",
fontSize: ScreenUtil.getInstance().setSp(26))),
TextFormField(
controller: _email,
keyboardType: TextInputType.emailAddress,
validator: (value) {
if (value.isEmpty) {
setState(() {
_formheight = 620;
});
return AppLocalizations.of(context)
.translate('email_empty');
}
return null;
},
decoration: InputDecoration(
hintText: AppLocalizations.of(context)
.translate('email')
.toLowerCase(),
hintStyle: TextStyle(
color: Colors.grey,
fontSize: ScreenUtil.getInstance().setSp(23))),
),
SizedBox(
height: ScreenUtil.getInstance().setHeight(30),
),
Text(AppLocalizations.of(context).translate('password'),
style: TextStyle(
fontFamily: "Poppins-Medium",
fontSize: ScreenUtil.getInstance().setSp(26))),
TextFormField(
controller: _password,
obscureText: true,
validator: (value) {
if (value.isEmpty) {
setState(() {
_formheight = 620;
});
return AppLocalizations.of(context)
.translate('password_empty');
}
return null;
},
decoration: InputDecoration(
hintText: AppLocalizations.of(context)
.translate('password')
.toLowerCase(),
hintStyle: TextStyle(
color: Colors.grey,
fontSize: ScreenUtil.getInstance().setSp(23))),
),
SizedBox(
height: ScreenUtil.getInstance().setHeight(35),
),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Text(
AppLocalizations.of(context).translate('forgot-btn'),
style: TextStyle(
color: Colors.blue,
fontFamily: "Poppins-Medium",
fontSize: ScreenUtil.getInstance().setSp(28)),
)
],
),
user.status == Status.Authenticating
? Center(
child: Padding(
padding: EdgeInsetsResponsive.only(top: 40),
child: CircularProgressIndicator(),
))
: CustomizedButton(
width: 700,
height: 100,
color1: Color(0xFF17ead9),
color2: Color(0xFF6078ea),
text: AppLocalizations.of(context)
.translate('signin-btn'),
action: () async {
print("EMAIL: " + _email.text.toString());
print("PASSWORD: " + _password.text.toString());
if (_formKey.currentState.validate()) {
setState(() {
_formheight = 550;
});
if (!await user.signIn(
_email.text, _password.text)) {
print(Text("something is wrong"));
}
/*_key.currentState.showSnackBar(SnackBar(
content: Text("Something is wrong"),
));()
*/
}
})
],
),
),
),
),
Padding(
padding: EdgeInsetsResponsive.only(top: 20, bottom: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
horizontalLine(),
Text(AppLocalizations.of(context).translate('social-title'),
style: TextStyle(
fontSize: ScreenUtil.getInstance().setSp(35),
fontFamily: "Poppins-Medium")),
horizontalLine()
],
),
),
SignInButton(
Buttons.Facebook,
mini: false,
text: AppLocalizations.of(context).translate('fb-login-btn'),
onPressed: () {},
),
SignInButton(
Buttons.Google,
mini: false,
text: AppLocalizations.of(context).translate('go-login-btn'),
onPressed: () {},
),
]));
}
#override
void dispose() {
_email.dispose();
_password.dispose();
super.dispose();
}
}
Unlogged_bloc
import 'package:flutter/material.dart';
import 'package:lyric_hero/widgets/Unlogged/LoginForm.dart';
import 'package:responsive_widgets/models/responsive_widgets_model.dart';
class UnloggedBloc extends ChangeNotifier {
Widget _root = LoginForm();
Alignment _alignment = Alignment.center;
double _paddingbottom = 40;
double _paddingtop = 0;
bool _show = false;
bool _login = true;
Widget get root => _root;
Alignment get alignment => _alignment;
double get paddingbottom => _paddingbottom;
double get paddingtop => _paddingtop;
bool get show => _show;
bool get login => _login;
void setRoot(Widget widget) {
_root = widget;
notifyListeners();
}
void setAlignment(Alignment align) {
_alignment = align;
notifyListeners();
}
void setPaddingBottom(double d) {
_paddingbottom = d;
notifyListeners();
}
void setPaddingTop(double d) {
_paddingtop = d;
notifyListeners();
}
void setLogin() {
_login = !_login;
notifyListeners();
}
void setShow() {
_show = !_show;
notifyListeners();
}
}
Ill try and provide as much code as possible. (mainly regarding the image ill be using "other data" instead of posting non needed code besides the image)
So in my app I have a File image; provider and im having issues with getting to display it on my app. Im unable to pass the File image path into firebase and its causing my app to crash when I try Fetching the data from firebase. Ill try providing as much code as possible.
Here is my provider:
import 'dart:io';
class AddCar {
// other data
File image;
AddCar({
// other data
this.image,
});
}
Here is my provider code:
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:io';
import '../add_ons/add_car.dart';
List<AddCar> _cars = [];
class Cars with ChangeNotifier {
List<AddCar> get cars {
return [..._cars];
}
Future<void> fetchAndSetCars() async {
const url = 'https://mycustomlink.firebaseio.com/cars.json';
try {
final response = await http.get(url);
final extractedData = json.decode(response.body) as Map<String, dynamic>;
var loadedCars = extractedData
.map<String, AddCar>((carId, carData) => MapEntry(
carId,
AddCar(
// other data
image: File(carData['image']),
)))
.values
.toList();
_cars = loadedCars;
print(extractedData);
print(loadedCars);
notifyListeners();
} catch (error) {
throw (error);
}
}
AddCar findById(String id) {
return _cars.firstWhere((carProd) => carProd.id == id);
}
void addCar(AddCar car) {
const url = 'https://mycustomlink.firebaseio.com/cars.json';
http.post(
url,
body: json.encode({
// other data
'image': car.image.toString(),
}),
);
final newCar = AddCar(
// other data
image: car.image,
);
_cars.insert(0, newCar);
notifyListeners();
}
}
here is my form where the user enters data for it to be displayed:
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_app/app_localization.dart';
import 'package:google_fonts_arabic/fonts.dart';
import 'package:provider/provider.dart';
import 'package:file_picker/file_picker.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:io';
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart' as syspaths;
import '../add_ons/add_car.dart';
import '../providers/car_provider.dart';
import '../drawer/drawer.dart';
import '../screens/cars_screen.dart';
import '../app_localization.dart';
class CreateCar extends StatefulWidget {
static const routeName = '/create-car';
#override
_CreateCarState createState() => _CreateCarState();
}
class _CreateCarState extends State<CreateCar> {
final _name = TextEditingController();
final _price = TextEditingController();
final _address = TextEditingController();
String img;
static Future<String> fileToB64(File f) async {
List<int> imageBytes = f.readAsBytesSync();
return base64Encode(
imageBytes,
);
}
Future<void> _takePicture() async {
final imageFile = await ImagePicker.pickImage(
source: ImageSource.gallery,
);
fileToB64(data.image).then((d) {
setState(() {
img = d; //base64Decode(d);
});
});
}
final _form = GlobalKey<FormState>();
int currStep = 0;
static AddCar data = new AddCar(
id: null,
date: DateTime.now(),
sponsNum: '',
);
void _saveForm() {
final isValid = _form.currentState.validate();
if (!isValid) {
return;
}
_form.currentState.save();
Provider.of<Cars>(context, listen: false).addCar(data);
Navigator.of(context).pushNamed(CarsScreen.routeName);
print('this works');
}
#override
Widget build(BuildContext context) {
List<Step> steps = [
Step(
title: Text(
AppLocalizations.of(context).createTabTitle,
),
isActive: true,
state: StepState.indexed,
content: Column(
children: <Widget>[
// other data
],
),
),
Step(
title: Text(
AppLocalizations.of(context).createCarDetails,
),
isActive: true,
state: StepState.indexed,
content: Column(
children: <Widget>[
// other data
Column(
children: <Widget>[
Padding(
padding: const EdgeInsets.only(top: 25.0),
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Theme.of(context).primaryColor),
borderRadius: BorderRadius.circular(50.0),
),
child: FlatButton(
child: Text(AppLocalizations.of(context).createAddImages),
onPressed: _takePicture,
),
),
)
],
)
],
),
),
];
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text(
AppLocalizations.of(context).createCarPageTitle,
textAlign: TextAlign.center,
style: TextStyle(
fontFamily: ArabicFonts.Tajawal,
package: 'google_fonts_arabic',
),
),
actions: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
IconButton(
icon: Icon(Icons.save),
onPressed: _saveForm,
),
IconButton(
icon: Icon(Icons.arrow_forward),
onPressed: () {
Navigator.of(context).pop();
},
)
],
),
],
),
drawer: MyDrawer(),
body: Row(
children: <Widget>[
Form(
key: _form,
child: Expanded(
child: Stepper(
steps: steps,
type: StepperType.vertical,
currentStep: this.currStep,
onStepContinue: () {
setState(() {
if (currStep < steps.length - 1) {
currStep = currStep + 1;
} else {
// currStep = 0;
}
});
},
onStepCancel: () {
setState(() {
if (this.currStep > 0) {
this.currStep = this.currStep - 1;
} else {
this.currStep = 0;
}
});
},
onStepTapped: (step) {
setState(() {
currStep = step;
});
},
),
),
),
],
),
);
}
}
which is later passed into my "CarItem" that will display my code:
import 'package:flutter/material.dart';
import 'package:google_fonts_arabic/fonts.dart';
import '../icons/MyIcons.dart';
import 'dart:io';
import '../details/car_details.dart';
import '../app_localization.dart';
class CarItem extends StatelessWidget {
final File image;
CarItem(
this.image,
);
#override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(color: Theme.of(context).primaryColor, width: 2.0),
),
),
child: Column(
children: <Widget>[
Container(
decoration: BoxDecoration(
color: Color.fromARGB(255, 245, 245, 245),
),
child: Padding(
padding: const EdgeInsets.fromLTRB(17.0, 4.0, 17.0, 4.0),
child: Row(
textDirection: TextDirection.rtl,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
// other data
],
),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Container(
width: MediaQuery.of(context).size.width * 0.35,
height: MediaQuery.of(context).size.width * 0.35,
child: GestureDetector(
child: Image.file(
image,
fit: BoxFit.fill,
),
onTap: () {
Navigator.of(context).pushNamed(
MyCarDetails.routeName,
arguments: id,
);
},
),
),
Container(
width: MediaQuery.of(context).size.width * 0.65,
margin: EdgeInsets.all(0),
padding: const EdgeInsets.fromLTRB(22.0, 5.0, 22.0, 0),
child: Column(
children: <Widget>[
// other data
],
),
),
],
),
),
],
),
],
),
);
}
}
this code gets called by a list that will call the code and display it in my app:
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:google_fonts_arabic/fonts.dart';
import '../providers/car_provider.dart';
import '../widget/car_item.dart';
class CarsList extends StatefulWidget {
#override
_CarsListState createState() => _CarsListState();
}
class _CarsListState extends State<CarsList> {
#override
Widget build(BuildContext context) {
final carsData = Provider.of<Cars>(context);
final car = carsData.cars;
return car.isEmpty
? Center(
child: Text(
'no data yet available',
style: TextStyle(
fontFamily: ArabicFonts.Tajawal,
fontWeight: FontWeight.bold,
package: 'google_fonts_arabic',
),
))
: ListView.builder(
padding: const EdgeInsets.only(bottom: 47.0),
itemCount: car.length,
itemBuilder: (ctx, i) => CarItem(
// other data
car[i].image,
),
);
}
}
this is the error i keep getting when It tries to display fetched data:
════════ Exception caught by widgets library ═══════════════════════════════════
The following NoSuchMethodError was thrown building CarItem(dirty, dependencies: [_LocalizationsScope-[GlobalKey#31697], MediaQuery, _InheritedTheme]):
The method '+' was called on null.
Receiver: null
Tried calling: +("25")
User-created ancestor of the error-causing widget was
ListView
lib\home_parts\cars_area.dart:49
When the exception was thrown, this was the stack
#0 Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
#1 CarItem.build
package:flutter_app/widget/car_item.dart:151
#2 StatelessElement.build
package:flutter/…/widgets/framework.dart:4009
#3 ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:3941
#4 Element.rebuild
package:flutter/…/widgets/framework.dart:3738
...
════════════════════════════════════════════════════════════════════════════════
How can I fix this? is the issue in how im passing the data to firebase and displaying it on my app?