Как заполнить данные JSON, когда идентификатор передается от первого действия ко второму действию - PullRequest
1 голос
/ 04 августа 2020

Я новичок в флаттере. Я разрабатываю приложение для контактов, используя laravel бэкэнд. У меня есть две таблицы, которые ограничены внешним ключом, а json ответ работает на почтальоне. во Flutter у меня есть две модели: модель пользователя и модель пользователя. имя пользователя в виде списка, как показано ниже, и отлично работает

class ListUsers extends StatefulWidget {
 
  @override
  _ListItemsState createState() => _ListItemsState();
}

class _ListUsersState extends State<ListUsers> {

  UsersApi usersApi;
  @override
  void initState() {
    super.initState();
    usersApi = UsersApi();
   usersApi.fetchAllUsers();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('My Contacts'),
      ),
      body: Container(
        padding: EdgeInsets.all(16),
        child:FutureBuilder(
          future: itemsApi.fetchAllUsers(),
          builder: (BuildContext context, AsyncSnapshot<List<Users>> snapshot)
          {
            switch(snapshot.connectionState)
            {
              case ConnectionState.active:
                // working
              return _loading();
                break;
              case ConnectionState.waiting:
                //working
                return _loading();
                break;
              case ConnectionState.none:
                // no connection
              return _error('No connection has been made');
                break;
               case ConnectionState.done:
                // completed
                if(snapshot.hasError)
                  {
                    return _error(snapshot.error.toString());
                  }
                if(snapshot.hasData)
                  {
                    return _drawItemsList(snapshot.data,context);
                  }
                break;
            }
            return Container();
          },
        ),
      ),
    );

  }
  Widget _drawItemsList(List<Users> myusers,BuildContext context)
  {
    return ListView.builder(
      itemCount: myusers.length,
      itemBuilder: (BuildContext context, int position){
        return InkWell(
          child:Card(
            child:Padding(
              padding: const EdgeInsets.all(8.0),
            child: Text(musers[position].myuser_name),
          ) ,
          ),
          onTap: (){
            Navigator.push(context, MaterialPageRoute(builder: (context)=>UserDetails(muysers[position].id)));
            

          },
        );

      },

    );
  }
  Widget _loading()
  {
    return Container(
      child: Center(
        child: CircularProgressIndicator(),
      ),
    );
  }
  Widget _error(String error)
  {
    return Container(
      child: Center(
        child: Text('Something went wrong'

        ),
      ),
    );
  }



}

мой вызов Api для загрузки listView здесь также отлично работает

class UsersApi {

  Future<List<Users>> fetchAllUsers() async //
      {
    
    String allUsers = CallApi.url + CallApi.items_url;
    Map<String, String> headers =
    {
      'Accept': 'application/json',
      
    };
    var response = await http.get(allUsers, headers: headers);
      List<Users> users = []; // its empty list we add it below
    if (response.statusCode == 200) {
      Map<String, dynamic> body = jsonDecode(response.body);
      for (var item in body['data']) {
        Users myUsers = Users.fromJson(item);
        items.add(myUsers);
      }
    }
    return users;
  }
}

Теперь ошибка возникает, запомнив, передав один идентификатор из Первый экран делает запрос

CallApi.url+CallApi.My_Contacts+itemId; 

на второй экран и загружает подробную информацию о кликах. для загрузки другой информации пользователя из другой таблицы я создал модель, и вот мой запрос на второй экран

    class UserDetailApi {
    
      Future<List<UserDetailModel>> fetchDetailOfSingleUser(String itemId) async
      {
        
        String userDetailUrl = CallApi.url+CallApi.My_Contacts+itemId;
        Map<String,String> headers =
        {
          'Accept' : 'application/json',
        };
        var response = await http.get(userDetailUrl ,headers:headers);
        List<UserDetailModel> user =[];
        if(response.statusCode == 200)
          {
            Map<String, dynamic> body = jsonDecode(response.body);
            for(var item in body['data'])
              {
                UserDetailModel userr = UserDetailModel.fromJson(item);
                user.add(userr);
              }
          }
        return user;
        }
}

вот второе действие

class UserDetails extends StatefulWidget
{
  final String uId;
 

  UserDetails(this.uId);
  @override
  _UserDetailsState createState()=>_UserDetailsState();
}

class _UserDetailsState extends State<UserDetails>
{
  
  UserDetailApi itemsApi = UserDetailApi();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar:AppBar(
        title:Text('Detailed Info'),
      ),
      body: Container(
        padding: EdgeInsets.all(16),
        child: FutureBuilder(
          future: itemsApi.fetchDetailOfSingleUser(widget.uId),
          builder: (BuildContext context, AsyncSnapshot<List<UserDetailModel>> snapshot)
          {
            switch(snapshot.connectionState)
            {
              case ConnectionState.active:
              // working
                return _loading();
                break;
              case ConnectionState.waiting:
              //working
                return _loading();
                break;
              case ConnectionState.none:
              // no connection
                return _error('No connection has been made');
                break;
              case ConnectionState.done:
              // completed
                if(snapshot.hasError)
                {
                  //return _error(snapshot.error.toString());
                }
                if(snapshot.hasData)
                {
                  return _drawItemsList(snapshot.data);
                }
                break;
            }
            return Container();
          },
        ),
      ),
    );

  }
  Widget _drawItemsList(List<UserDetailModel> mdetail)
  {
    return ListView.builder(
      itemCount: mdetail.length,
      itemBuilder: (BuildContext context, int position){
        return Padding(
          padding: const EdgeInsets.all(8.0),
          child: ListView.builder(
            itemCount: mdetail.length,
            itemBuilder: (BuildContext context, int position){
              return InkWell(
                child: Card(
                  child: Padding(
                    padding: EdgeInsets.all(8.0),
                    child:  Text(here i need to display full user info from second table),
                  ),
                ),

              );
            },

          ),

        );


      },

    );
  }
  Widget _loading()
  {
    return Container(
      child: Center(
        child: CircularProgressIndicator(),
      ),
    );
  }
  Widget _error(String error)
  {
    return Container(
      child: Center(
        child: Text('Something went wrong'

        ),
      ),
    );
  }

}

пустой экран, в TextBox нет результатов, поэтому скажите, пожалуйста, где я пропустил, или если мои работы некорректны за детальную работу, спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...