1

我正在使用带有 3 页的底部导航栏。其中之一(主页)有一个搜索图标。每次我按下它,键盘只出现一秒钟,然后消失,应用程序自行重建。我在网上尝试了其他解决方案,例如将未来值放入 initState() 但它不起作用。请注意,我还实施了注册/登录系统。当用户注册/登录后,他们将被重定向到具有底部导航栏的页面。(另外,我做了一些研究,显然,当颤振应用程序变得复杂时,只有安卓手机会“遭受”这个问题。虽然我不知道它有多少是真的)

这是底部导航栏的代码

 class BottomNavigationPage extends StatefulWidget{
  final AfreecaInvestAccount _afreecaInvestAccount;
  _BottomNavigationPageState createState() => _BottomNavigationPageState();
  BottomNavigationPage(this._afreecaInvestAccount);
}

class _BottomNavigationPageState extends State<BottomNavigationPage> {
  
  static List<Widget> widgetOptions;
  int selectedIndex = 0;
  @override
  void initState() {
    widgetOptions = 
    [
      HomePage(widget._afreecaInvestAccount),
      StockSearchPage(),
      AccountPage(widget._afreecaInvestAccount)
    ];
    super.initState();
  }
  
  void onTabTapped(int index) {
    setState(() {
      selectedIndex = index;
    });
  }
  @override
  Widget build(BuildContext context) {
     return Scaffold(
       body: widgetOptions.elementAt(selectedIndex),
       bottomNavigationBar: _bottomNavigationBar(),
     );
  }
  
  BottomNavigationBar _bottomNavigationBar() {
    return BottomNavigationBar(
        items: const<BottomNavigationBarItem>
        [
          BottomNavigationBarItem(icon: Icon(Icons.home), label: "Home"),
          BottomNavigationBarItem(icon: Icon(Icons.search), label: "Search Stocks"),
          BottomNavigationBarItem(icon: Icon(Icons.account_box), label: "Account"),
        ],
        currentIndex: selectedIndex,
        onTap: onTabTapped,
    );
  }
  
}

这是主页的代码:

class HomePage extends StatefulWidget {
  final AfreecaInvestAccount _afreecaInvestAccount;
  @override
  _HomePage createState() => _HomePage(_afreecaInvestAccount);
  HomePage(this._afreecaInvestAccount);
}

class _HomePage extends State<HomePage> {
  Future<List<int>> _futureBPandOSValue;
  final AfreecaInvestAccount _afreecaInvestAccount;
  FutureBuilder<List<int>> _futureBuilder;
  String _accessToken;
  List<String> list =
  [
    "TSLA",
    "AMZN",
    "GME",
    "AAPL"
  ];
  _HomePage(this._afreecaInvestAccount);
  @override
  void initState() {
    // TODO: implement initState
//    timer = Timer.periodic(Duration(seconds: 30), (timer) {build(context);});
     _accessToken = _afreecaInvestAccount.accessToken;
     _futureBPandOSValue = _futureBPAndOSValues(_accessToken);
     _futureBuilder = FutureBuilder<List<int>> (
       future: _futureBPandOSValue,
       builder: _BPandOSValueBuilder,
     );
     super.initState();
  }

  void buildWidget() {
    setState(() {

    });
  }


  @override
  Widget build(BuildContext context) {
//    String _selectedItem;

    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
        automaticallyImplyLeading: false,
        actions: [
        IconButton(
            icon: Icon(Icons.search),
            onPressed: () {
              showSearch(context: context, delegate: StockSearch());
            },
          )
        ],
        ),
      body: SingleChildScrollView(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
//          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            _futureBuilder,
            SizedBox(height: 10.0,),
            Card(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: _returnStocksTable(context, _accessToken),
             /* _returnStocksTable method is not included in this code block because it is not the cause of the problem */
              )
            ),
        ],
       ),
     )
    );
  }


}

对于这段代码,flutter 本身已经提供了 showSearch :

onPressed: () {
              showSearch(context: context, delegate: StockSearch());
            },

这是 StockSearch() 文件:

class StockSearch extends SearchDelegate<String> {
  String accessToken = "djdjicjscnjdsncjs";
  List<String> stockList =
  [
    "TSLA",
    "AMZN",
    "GME",
    "AAPL"
  ];
  final recentStocks = ['TSLA'];
  @override
  List<Widget> buildActions(BuildContext context) {
    // actions for app bar
    return [
      IconButton(icon: Icon(Icons.clear), onPressed: () {
        query = "";
      })
    ];
  }

  @override
  Widget buildLeading(BuildContext context) {
    // leading icon on the left of the app bar
    return IconButton(
        icon: AnimatedIcon(
          icon: AnimatedIcons.menu_arrow,
          progress: transitionAnimation,
      ),
      onPressed: () {
          close(context, null);
      }

    );
  }

  @override
  Widget buildResults(BuildContext context) {
    return Container();
  }

  @override
  Widget buildSuggestions(BuildContext context) {
    // show when someone searches for stocks
    final suggestionList = query.isEmpty? recentStocks
        : stockList.where((stock) => stock.startsWith(query)).toList();

    return ListView.builder(
      itemBuilder: (context, index) => ListTile(
        onTap: () {
          WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
            Navigator.push(context, MaterialPageRoute(builder: (context) => TransactionPage(suggestionList.elementAt(index), accessToken)));
          });
        },
        title: RichText(text: TextSpan(
          text: suggestionList.elementAt(index).substring(0, query.length),
          style: TextStyle( color: Colors.black, fontWeight: FontWeight.bold),
          children: [TextSpan(
            text: suggestionList.elementAt(index).substring(query.length),
            style: TextStyle(color: Colors.grey)
           )
          ]
        )
        ),
      ),
      itemCount: suggestionList.length,
    );
  }
}

预先感谢您的帮助!

4

0 回答 0