Флаттер, как передать параметры на другой экран - PullRequest
0 голосов
/ 23 апреля 2020

Как я могу передать параметры на другой экран, класс без кнопки? Я хочу обновить панель навигации, чтобы скрыть ее при прокрутке

Home.dart

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter2/screen/login.dart';
import 'package:flutter2/network_utils/api.dart';
import 'package:flutter2/widgets/navbar.dart';
import 'package:flutter2/screen/page2.dart';
import 'package:flutter2/screen/search.dart';
import 'package:flutter2/widgets/loading.dart';
import 'package:flutter2/widgets/skeleton.dart';
import 'package:flutter2/screen/add.dart';
import 'package:http/http.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:developer' as developer;
import 'package:geolocator/geolocator.dart';
//import 'package:location/location.dart';
import 'package:flutter2/screen/register.dart';
import 'package:carousel_pro/carousel_pro.dart';
import 'package:maps_launcher/maps_launcher.dart';
import 'package:flutter_web_browser/flutter_web_browser.dart';
import 'dart:developer';
import 'package:flutter/foundation.dart';
import 'dart:async';
import 'package:flutter/rendering.dart';
import '../keys.dart' as globals;

class Home extends StatefulWidget {
  final String hometitle;
  Home(this.hometitle);

  @override
  _HomeState createState() => _HomeState();


}

class _HomeState extends State<Home>{

  List<dynamic> posts = [];
 // List<dynamic> searchPosts = [];
  List<dynamic> tmpPosts = [];
  List imagesPosts = [];
  List tmpImagesPosts = [];
  String name;
  String _urlImages;
  var page = 1;
  var perPage = 0;
  var totalData = 0;
  var totalPage = 0;
  var lat;
  var longt;
  bool isLoading = false;
  bool loading = false;
  bool isSearching = false;
  ScrollController scrollController = ScrollController();
  bool isScrollingDown = false;

  Color _iconColor = Colors.black;
  //Timer timer;
  @override
  void initState(){
    //logout();
    _loadImageUrl();
    _loadUserData();
    _loadSkeleton();
    scrollController.addListener(() {
      if (scrollController.position.pixels ==
          scrollController.position.maxScrollExtent) {
        print('Slide to the bottom ${scrollController.position.pixels}');
        setState(() {
          isLoading = true;
        }); 
         _loadmore();
      }
      if (scrollController.position.userScrollDirection ==
        ScrollDirection.reverse) {
      if (!isScrollingDown) {
        isScrollingDown = true;
        print(isScrollingDown);
        setState(() {
           navBarKey.currentState.visible = isScrollingDown;

        });
        //_showAppbar = false;
       // hideBottomBar();
      }
    }
    if (scrollController.position.userScrollDirection ==
        ScrollDirection.forward) {
      if (isScrollingDown) {
        isScrollingDown = false;
        print(isScrollingDown);

        setState(() {
        navBarKey.currentState.visible = isScrollingDown;

        });
        //_showAppbar = true;
        //showBottomBar();
      }
    }
    });

    super.initState();
    //timer = Timer.periodic(Duration(seconds: 2), (Timer t) => _handleRefresh());
    print(widget.hometitle);
  }
...

Navbar.dart

import 'package:flutter/material.dart';
import 'package:flutter2/screen/add.dart';
import 'package:flutter2/screen/login.dart';
import 'package:flutter2/screen/page2.dart';
import 'package:flutter2/screen/register.dart';
import 'package:flutter2/screen/home.dart';
import 'package:curved_navigation_bar/curved_navigation_bar.dart';
import 'package:flutter2/screen/search.dart';
import 'package:flutter/rendering.dart';
import 'dart:async';
import 'package:flutter/widgets.dart';
import '../keys.dart' as globals;

class NavBar extends StatefulWidget {

  //const  NavBar({ Key key, @required this.homettitle }): super(key: key);
  const NavBar({Key navBarKey}) : super(key: navBarKey);
  @override
  _NavBarState createState() => _NavBarState();


}

   final GlobalKey<_NavBarState> navBarKey = new GlobalKey();


class _NavBarState extends State<NavBar>{
  @override
  void initState() { 

    super.initState();
    //print(navBarKey);

  }
    bool visible;
    Timer timer;
    int _selectedTabIndex = 0; 
    int _pagec=0;
    List _pages = [
        Home("Home"),
        Search(),
        AddPosts(), 
        //Text("About")
  ]; 


_changeIndex(int index) {
    setState(() {
      _selectedTabIndex = index; 
    }); 
  }
  Widget build(BuildContext context) {
     return Scaffold(
       key: navBarKey,
      bottomNavigationBar: CurvedNavigationBar(
        backgroundColor: Colors.white,
        color: Colors.teal,
        buttonBackgroundColor: Colors.teal,
        height: 60,
        animationDuration: Duration(
          milliseconds: 200,
        ),
        index: 0,
        animationCurve: Curves.bounceInOut,
        items: <Widget>[
          Icon(Icons.home, size: 30, 
          color: Colors.white),
          Icon(Icons.search, size: 30, 
          color: Colors.white),
          Icon(Icons.add, size: 30, 
          color: Colors.white),
          Icon(Icons.settings, size: 30, 
          color: Colors.white),
          Icon(Icons.more_horiz, size: 30, 
          color: Colors.white),
        ],
        onTap: (index) {
          setState(() {
          _pagec = index;
          });
        },
      ),
      body: _pages[_pagec],
    ); 
}
}

Отредактировано с полным кодом дротика файлы, проблема заключается в том, чтобы передать переменную bool в NavBar.dart в Home.dart как globalkey или как переменную. Также я создал файл key.dart ниже (я не знаю, правильно ли он создан

keys.dart

library flutter2.globals;
import 'package:flutter2/widgets/navbar.dart';
import 'package:flutter/material.dart';

   final GlobalKey navBarKey = new GlobalKey();```

1 Ответ

1 голос
/ 23 апреля 2020

Вы можете использовать GlobalKey для решения вашей проблемы, это поможет вам определить и получить доступ к состоянию уникального виджета в дереве:

// 1. Create a final variable storing your GlobalKey
final GlobalKey<NavBarState> navBarKey = GlobalKey();

// 2. Then when adding the NavBar widget in the tree, add to it the created key
NavBar(
  key: navBarKey,
  ...
)

// 3. Finally use the key to update the nav bar state on scroll
if (scrollController.position.userScrollDirection == ScrollDirection.forward) {
  if (isScrollingDown) {
    isScrollingDown = false;
    print(isScrollingDown);
    bool show = true;
    setState(() {
      // Here you update the nav bar state
      // Make sure that in your NavBarState you have a boolean getter "visible", allowing you to change the visibility state of the nav bar
      navBarKey.currentState.visible = show;
    });
    //_showAppbar = true;
    //showBottomBar();
  }
}

РЕДАКТИРОВАТЬ

Это редактирование просто покажет вам, как выполнить предыдущие шаги с кодом, который вы разместили:

1. В keys.dart файле

import 'package:flutter2/widgets/navbar.dart';

final GlobalKey<NavBarState> navBarKey = GlobalKey();

2. В NavBar.dart файле

// ..imports
// No need to import the keys.dart file here
// import '../keys.dart' as globals;

class NavBar extends StatefulWidget {
  // const  NavBar({ Key key, @required this.homettitle }): super(key: key);
  // Never use a GlobalKey here !
  const NavBar({Key key}) : super(key: key);

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

// This GlobalKey is declared in the keys.dart file, not here !
// final GlobalKey<_NavBarState> navBarKey = new GlobalKey();

// The NavBarState class MUST be public when using it with GlobalKey
// Suppress the _ at the start
class NavBarState extends State<NavBar>{
  @override
  void initState() { 
    super.initState();
    // print(navBarKey);
  }

  // This is the visibility switch
  bool _navBarVisibility;

  // This must be a get/set changing the visibility of CustomNavbar
  bool get visible => _navBarVisibility;
  set visible(bool eneble) => setState(() => _navBarVisibility = enable);

  Timer timer;
  int _selectedTabIndex = 0; 
  int _pagec=0;
  List _pages = [
    Home("Home"),
    Search(),
    AddPosts(), 
    //Text("About")
  ]; 


  _changeIndex(int index) {
    setState(() {
      _selectedTabIndex = index; 
    }); 
  }

  Widget build(BuildContext context) {
    return Scaffold(
      // The key is not used here!
      // key: navBarKey,
      // Switch the visibility of your nav bar here
      // Maybe a better approach is to use the Visibility widget
      // Or animate the disappearance of the nav bar
      bottomNavigationBar: !_navBarVisibility ? null : CurvedNavigationBar(
        backgroundColor: Colors.white,
        color: Colors.teal,
        buttonBackgroundColor: Colors.teal,
        height: 60,
        animationDuration: Duration(
          milliseconds: 200,
        ),
        index: 0,
        animationCurve: Curves.bounceInOut,
        items: <Widget>[
          Icon(Icons.home, size: 30, 
            color: Colors.white),
          Icon(Icons.search, size: 30, 
            color: Colors.white),
          Icon(Icons.add, size: 30, 
            color: Colors.white),
          Icon(Icons.settings, size: 30, 
            color: Colors.white),
          Icon(Icons.more_horiz, size: 30, 
            color: Colors.white),
        ],
        onTap: (index) {
          setState(() {
            _pagec = index;
          });
        },
      ),
      body: _pages[_pagec],
    ); 
  }
}

3. В файле HomePage.dart (а может и других)

// ...imports
// Import keys.dart file as follows
import 'package:flutter2/keys.dart' as globals;

class Home extends StatefulWidget {
  final String hometitle;
  Home(this.hometitle);

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

class _HomeState extends State<Home> {
  List<dynamic> posts = [];
  // List<dynamic> searchPosts = [];
  List<dynamic> tmpPosts = [];
  List imagesPosts = [];
  List tmpImagesPosts = [];
  String name;
  String _urlImages;
  var page = 1;
  var perPage = 0;
  var totalData = 0;
  var totalPage = 0;
  var lat;
  var longt;
  bool isLoading = false;
  bool loading = false;
  bool isSearching = false;
  ScrollController scrollController = ScrollController();
  bool isScrollingDown = false;

  Color _iconColor = Colors.black;
  // Timer timer;

  @override
  void initState() {
    // logout();
    _loadImageUrl();
    _loadUserData();
    _loadSkeleton();
    scrollController.addListener(() {
      if (scrollController.position.pixels == scrollController.position.maxScrollExtent) {
        print('Slide to the bottom ${scrollController.position.pixels}');
        setState(() {
          isLoading = true;
        }); 
        _loadmore();
      }
      if (scrollController.position.userScrollDirection == ScrollDirection.reverse) {
      if (!isScrollingDown) {
        isScrollingDown = true;
        print(isScrollingDown);
        setState(() {
          // Update the visible state of the nav bar here
          globals.navBarKey.currentState.visible = isScrollingDown;
        });
        // _showAppbar = false;
        // hideBottomBar();
      }
    }
    if (scrollController.position.userScrollDirection == ScrollDirection.forward) {
      if (isScrollingDown) {
        isScrollingDown = false;
        print(isScrollingDown);

        setState(() {
           // Update the visible state of the nav bar here
           globals.navBarKey.currentState.visible = isScrollingDown;
        });
        // _showAppbar = true;
        // showBottomBar();
      }
    }
    });

    super.initState();
    // timer = Timer.periodic(Duration(seconds: 2), (Timer t) => _handleRefresh());
    print(widget.hometitle);
  }
...

4. На ВСЕХ страницах, на которых вы создаете NavBar виджет

// You MUST specify the key in ANY widgets using the NavBar widget
import 'package:flutter2/keys.dart' as globals;

NavBar(
  key: navBarKey,
  ...
)

ИМХО, я думаю, что способ переключения между страницами в панели навигации неэффективен, лучше и чище использовать виджет Navigator.

Надеюсь, это поможет!

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