Как переключиться на другого сотрудника, нажав кнопку «ДАЛЕЕ»? А как мне добавить страницу после PageView.builder? - PullRequest
0 голосов
/ 13 июля 2020

У меня есть сотрудники с их изображениями, именами и адресами электронной почты, отображаемыми в форме pageView «количество сотрудников зависит от HTTP-запроса JSON API». Я хочу переключиться с одного сотрудника на другого, нажав кнопку «ДАЛЕЕ». Кроме того, я хотел бы добавить страницу после просмотра всех сотрудников PageViews.

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Employees(),
    );
  }
}

class Employees extends StatefulWidget {
  @override
  _EmployeesState createState() => _EmployeesState();
}

class _EmployeesState extends State<Employees> {
  PageController _controller = PageController(initialPage: 0,);

  getEmployees()async{
    String theUrl = 'http://demo8161595.mockable.io/employee';
    var res = await http.get(Uri.encodeFull(theUrl),headers:{"Accept":"application/json"});
    var responsBody = json.decode(res.body);
    print(responsBody);
    return responsBody;
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: new AppBar(
        title:Text("Employees") ,
      ),
      body:FutureBuilder(
        future: getEmployees(),
        builder: (BuildContext context , AsyncSnapshot snapshot){
          List snap = snapshot.data;
          if(snapshot.connectionState == ConnectionState.waiting){
            return Center(
              child: CircularProgressIndicator(),
            );
          }
          if(snapshot.hasError){
            return Center(
              child: Text("Error .... "),
            );
          }

          return PageView.builder(
            itemCount: snap.length,
            itemBuilder: (context,index){
              return PageView(
                controller:_controller,
                children: <Widget>[
                  Container(
                    padding: EdgeInsets.all(5.0),
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.start,
                      children: <Widget>[
                        Center(
                          child: CircleAvatar(
                            radius: 50.0,
                            backgroundImage:
                            NetworkImage("${snap[index]['avatar']}"),
                            backgroundColor: Colors.transparent,
                          ),
                        ),
                        SizedBox(height: 10.0),
                        Padding(
                          padding: EdgeInsets.all(5.0),
                          child:Column(
                            crossAxisAlignment: CrossAxisAlignment.stretch,
                            mainAxisAlignment: MainAxisAlignment.start,
                            children: <Widget>[

                              Text(
                                'Name',
                                style: TextStyle(fontSize: 25,fontWeight: FontWeight.bold,),
                              ),
                              SizedBox(height: 5.0),
                              Text("${snap[index]['firstName']}" + "  " + "${snap[index]['lastName']}",style: TextStyle(fontSize: 20)),
                            ],
                          ),
                        ),
                        SizedBox(height: 10.0),
                        Padding(
                          padding: EdgeInsets.all(5.0),
                          child:Column(
                            crossAxisAlignment: CrossAxisAlignment.stretch,
                            mainAxisAlignment: MainAxisAlignment.start,
                            children: <Widget>[
                              Text(
                                'Email',
                                style: TextStyle(fontSize: 25,fontWeight: FontWeight.bold,),
                              ),
                              SizedBox(height: 5.0),
                              Text("${snap[index]['email']}",style: TextStyle(fontSize: 20)),
                            ],
                          ),
                        ),
                        SizedBox(height:5.0),
                        Padding(
                          padding: EdgeInsets.all(5.0),
                          child: Column(
                            crossAxisAlignment: CrossAxisAlignment.stretch,
                            mainAxisAlignment: MainAxisAlignment.start,
                            children: <Widget>[
                              SizedBox(height: 20.0),
                              Center(
                                child: Container(
                                    padding: const EdgeInsets.all(8.0),
                                  child:  Center(
                                    child:Container(
                                      child: RaisedButton.icon(
                                        onPressed: () {
                                          int page = _controller.page.toInt();
                                          _controller.animateToPage(page + 1 ,  duration: Duration(milliseconds: 500),curve: Curves.ease,);
                                          _controller.jumpToPage(page+1);
                                          if(_controller.page.toInt() == snap.length)
                                          {
                                            Container(
                                              child: Center(
                                                child: Text("Last Page"),
                                              ),
                                            );
                                          }
                                        },
                                        color: Colors.teal,
                                        icon: Icon(Icons.navigate_next,color:Colors.white ,),
                                        label: Text("NEXT",style: TextStyle(color: Colors.white),),
                                      ),
                                    ),
                                  ),
                                ),
                              ),
                            ],
                          ),
                        ),
                      ],
                    ),
                  ),
                ],
              );
            },
          );
        },
      ),
    );
  }
}

1 Ответ

1 голос
/ 13 июля 2020

РЕДАКТИРОВАТЬ 2: Код изменен.

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Employees(),
    );
  }
}

class Employees extends StatefulWidget {
  @override
  _EmployeesState createState() => _EmployeesState();
}

class _EmployeesState extends State<Employees> {
  PageController _controller = PageController(initialPage: 0,);

  getEmployees()async{
    String theUrl = 'http://demo8161595.mockable.io/employee';
    var res = await http.get(Uri.encodeFull(theUrl),headers:{"Accept":"application/json"});
    var responsBody = json.decode(res.body);
    print(responsBody);
    return responsBody;
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: new AppBar(
        title:Text("Employees") ,
      ),
      body:FutureBuilder(
        future: getEmployees(),
        builder: (BuildContext context , AsyncSnapshot snapshot){
          List snap = snapshot.data;
          if(snapshot.connectionState == ConnectionState.waiting){
            return Center(
              child: CircularProgressIndicator(),
            );
          }
          if(snapshot.hasError){
            return Center(
              child: Text("Error .... "),
            );
          }

          return PageView.builder(
            itemCount: snap.length,
            itemBuilder: (context,index){
              return PageView(
                controller:_controller,
                children: snap.map((e) => employeePage(e,snap.length)).toList(),
              );
            },
          );
        },
      ),
    );
  }

  Widget employeePage(node , length)
  {
    return Container(
                    padding: EdgeInsets.all(5.0),
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.start,
                      children: <Widget>[
                        Center(
                          child: CircleAvatar(
                            radius: 50.0,
                            backgroundImage:
                            NetworkImage("${node['avatar']}"),
                            backgroundColor: Colors.transparent,
                          ),
                        ),
                        SizedBox(height: 10.0),
                        Padding(
                          padding: EdgeInsets.all(5.0),
                          child:Column(
                            crossAxisAlignment: CrossAxisAlignment.stretch,
                            mainAxisAlignment: MainAxisAlignment.start,
                            children: <Widget>[

                              Text(
                                'Name',
                                style: TextStyle(fontSize: 25,fontWeight: FontWeight.bold,),
                              ),
                              SizedBox(height: 5.0),
                              Text("${node['firstName']}" + "  " + "${node['lastName']}",style: TextStyle(fontSize: 20)),
                            ],
                          ),
                        ),
                        SizedBox(height: 10.0),
                        Padding(
                          padding: EdgeInsets.all(5.0),
                          child:Column(
                            crossAxisAlignment: CrossAxisAlignment.stretch,
                            mainAxisAlignment: MainAxisAlignment.start,
                            children: <Widget>[
                              Text(
                                'Email',
                                style: TextStyle(fontSize: 25,fontWeight: FontWeight.bold,),
                              ),
                              SizedBox(height: 5.0),
                              Text("${node['email']}",style: TextStyle(fontSize: 20)),
                            ],
                          ),
                        ),
                        SizedBox(height:5.0),
                        Padding(
                          padding: EdgeInsets.all(5.0),
                          child: Column(
                            crossAxisAlignment: CrossAxisAlignment.stretch,
                            mainAxisAlignment: MainAxisAlignment.start,
                            children: <Widget>[
                              SizedBox(height: 20.0),
                              Center(
                                child: Container(
                                    padding: const EdgeInsets.all(8.0),
                                  child:  Center(
                                    child:Container(
                                      child: RaisedButton.icon(
                                        onPressed: () {
                                          int page = _controller.page.toInt();
                                          _controller.animateToPage(page + 1 ,  duration: Duration(milliseconds: 500),curve: Curves.ease,);
                                          _controller.jumpToPage(page+1);
                                          if(_controller.page.toInt() == length)
                                          {
                                            Container(
                                              child: Center(
                                                child: Text("Last Page"),
                                              ),
                                            );
                                          }
                                        },
                                        color: Colors.teal,
                                        icon: Icon(Icons.navigate_next,color:Colors.white ,),
                                        label: Text("NEXT",style: TextStyle(color: Colors.white),),
                                      ),
                                    ),
                                  ),
                                ),
                              ),
                            ],
                          ),
                        ),
                      ],
                    ),
                  );
  }
}

РЕДАКТИРОВАТЬ 1: После того, как вы изменили код, я понял вашу ошибку.

Так работает виджет PageView

PageView(
  controller: _controller,
  children: [
    MyPage1Widget(),
    MyPage2Widget(),
    MyPage3Widget(),
  ],
)

Здесь вы предоставляете 3 экрана в дочерних элементах PageView и запрашиваете просмотр страницы go для следующего, когда * Вызывается 1015 * или _controller.next().

Но в вашем коде в дочерних элементах виджета PageView вы предоставили один контейнер, поэтому отображается только один экран. Вот почему вы не видите никаких изменений.

Предыдущий ответ:

Вам нужен PageViewController , через который вы можете прыгать / анимировать на любую страницу.

ШАГ 1: создать экземпляр контроллера просмотра страницы

class _EmployeesState extends State<Employees> {
PageController _controller = PageController(
    initialPage: 0,
);

ШАГ 2: Добавить контроллер просмотра страницы в the PageView

       return PageView(
                controller:_controller
                children: <Widget>[
                  Container(
                    padding: EdgeInsets.all(5.0),
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.start,
                      children: <Widget>[
                        Center(
                          child: CircleAvatar(
                            radius: 50.0,
                            backgroundImage:
                            NetworkImage("${snap[index]['avatar']}"),
                            backgroundColor: Colors.transparent,
                          ),
                        ),
                        .....

ШАГ 3: Изменение вида страницы при нажатии кнопки

onTap: () {
//Current page
int page = _controller.page.toInt();

//Animate to page
_controller.animateToPage(page + 1);

//Jump to page
controller.animateToPage(page + 1);

//if page view reaches last page
if(controller.page.toInt() == snap.length)
{
  //Navigate to some page
}

}

Выше приведена функция OnTapped, вы можете обернуть виджет Text в a и вставьте код в параметр ontapped.

Сообщите мне, если вы столкнетесь с ошибками.

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