Как связать firebase с флаттером макета приложения? - PullRequest
0 голосов
/ 10 марта 2020

Я использую Json сгенерированные данные для отображения на начальном этапе. Теперь я хочу получить данные из базы данных Firebase в реальном времени. Я добавил все плагины и коды, которые Google предоставляет при регистрации приложения на firebase. Я хочу получить данные из firebase в список, я много пробовал, но не смог подключиться, я новичок во флаттере, но сумел сделать код , После исследования я получил код, чтобы связать FireBase с флаттером, но запутался, чтобы интегрировать его с моим кодом, PLZ, помогите мне.

База данных Firebase: - Информация о базе данных

Код подключения я получил: -

static List<wanted> allcriminals() {

      var lstOfCities = new List<wanted>();
      Future <List<User>> queryUsers()  async{
        return FirebaseDatabase.instance
        .reference()
        .child('main db/criminal db');
      }
      queryUsers().then((query){
        query.once().then((snapshot) {
          var result = snapshot.value.values as Iterable;
          for (var item in result) {
            print(result);
            lstOfCities.add(new wanted(
                name: item["criminal name"],
                image: "hii",
                crimes_commited: item["crimes committed"],
                seen_at_location: item["seen at location"]
            ));

          }
        });
    });
    return lstOfCities;
    }

Код, который я хочу интегрировать с: -

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:flutter/painting.dart';
import 'dart:convert';
import 'dart:async';
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Criminal List',
      debugShowCheckedModeBanner: false,


      theme: ThemeData(

        primarySwatch: Colors.orange,

      ),
      home: MyHomePage(title: 'Criminal List'),

    );
  }
}

class Contact{
  Contact({this.name, this.email});
  final String name;
  final String email;
}
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);



  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

//api
class _MyHomePageState extends State<MyHomePage> {
  Future <List<User>> _getUsers()async{
    var data = await http.get("http://www.json-generator.com/api/json/get/cggcNzKhua?indent=2");
    var jsonData = json.decode(data.body);
    List<User> users = [];
    for (var u in jsonData){
      User user = User(u["index"],u["about"],u["name"],u["email"],u["picture"], u['gender'], u['age'],u['registered'], u['eyeColor'], u['phone'], u['address'], u['longitude'], u['latitude']);
      users.add(user);
    }

    print(users.length);

    return users;
  }
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: Container(
        child: FutureBuilder(
            future: _getUsers(),
            builder: (BuildContext context,AsyncSnapshot snapshot){
              print(snapshot.data);
              if(snapshot.data == null){
                return Container(
                  child: Center(
                    child: Text("Loading..."),
                  ),
                );
              } else {
                return ListView.builder(
                  itemCount: snapshot.data.length,
                  itemBuilder: (BuildContext content, int index) {
                    return ListTile(
                      leading: CircleAvatar(
                        backgroundImage: NetworkImage(
                            snapshot.data[index].picture
                        ),
                      ),
                      title: Text(snapshot.data[index].name),
                      subtitle: Text(snapshot.data[index].email),
                      onTap: (){
                        Navigator.push(context,
                            new MaterialPageRoute(builder: (context)=> DetailPage(snapshot.data[index]))
                        );
                      },
                    );
                  },
                );
              }
            }
        ),
      ),

    );
  }

}

class DetailPage extends StatelessWidget {

  final User user;
  DetailPage(this.user);

  @override
  Widget build(BuildContext context) {



    final profile = Hero (
      tag: 'hero',
      child: Padding(padding: EdgeInsets.all(16.0),
        child: CircleAvatar(
          radius: 72.0,
          backgroundColor: Colors.transparent,
          backgroundImage: NetworkImage(user.picture),
        ),
      ),
    );

    final name = Padding(
      padding: EdgeInsets.all(8.0),
      child: Text(
        user.name,
        style: TextStyle(fontSize: 28.0, color: Colors.black),
      ),
    );

    final email = Padding(
      padding: EdgeInsets.all(8.0),
      child: Text(
        user.email,
        style: TextStyle(fontSize: 18.0, color: Colors.black),
      ),
    );

    final about = Padding(
      padding: EdgeInsets.all(8.0),
      child: Text(
        user.about,
        style: TextStyle(fontSize: 14.0, color: Colors.black),
      ),
    );

    final gender = Padding(
      padding: EdgeInsets.all(8.0),
      child: Text(
        user.gender,
        style: TextStyle(fontSize: 14.0, color: Colors.black),
      ),
    );

    final age = Padding(
      padding: EdgeInsets.all(8.0),
      child: Text(
        user.age.toString(),
        style: TextStyle(fontSize: 14.0, color: Colors.black),
      ),
    );

    final registered = Padding(
      padding: EdgeInsets.all(8.0),
      child: Text(
        user.registered,
        style: TextStyle(fontSize: 14.0, color: Colors.black),
      ),
    );

    final eyeColor = Padding(
      padding: EdgeInsets.all(8.0),
      child: Text(
        user.eyeColor,
        style: TextStyle(fontSize: 14.0, color: Colors.black),
      ),
    );

    final phone = Padding(
      padding: EdgeInsets.all(8.0),
      child: Text(
        user.phone,
        style: TextStyle(fontSize: 14.0, color: Colors.black),
      ),
    );

    final address = Padding(
      padding: EdgeInsets.all(8.0),
      child: Text(
        user.address,
        style: TextStyle(fontSize: 14.0, color: Colors.black),
      ),
    );

  final longitude = Padding(
    padding: EdgeInsets.all(8.0),
    child: Text(
      user.longitude.toString(),
      style: TextStyle(fontSize: 14.0, color: Colors.black),
    ),
  );

    final latitude = Padding(
      padding: EdgeInsets.all(8.0),
      child: Text(
        user.latitude.toString(),
        style: TextStyle(fontSize: 14.0, color: Colors.black),
      ),
    );

    final body = Container(
      width: MediaQuery.of(context).size.width,
      padding: EdgeInsets.all(28.0),
      decoration: BoxDecoration(
        gradient: LinearGradient(colors: [
          Colors.orangeAccent,
          Colors.yellow,
        ]),
      ),
      child: SingleChildScrollView(
          child: Column(
            children: <Widget>[profile, name,email, about, gender, age, registered, eyeColor, phone, address, longitude, latitude],
          )),
    );

    return Scaffold(
      appBar: AppBar(
        title: Text(user.name),
      ),
      body: body,
    );
  }
}//data
class User {
  final int index;
  final String name;
  final String email;
  final String about;
  final String picture;
  final String gender;
  final int age;
  final String registered;
  final String eyeColor;
  final String phone;
  final String address;
  final double longitude;
  final double latitude;
  User (this.index,this.about, this.name, this.email, this.picture, this.gender,this.age, this.registered, this.eyeColor, this.phone, this.address, this.longitude, this.latitude);


}
...