簡體   English   中英

向 Scaffold Appbar 添加具有多個頁面的點擊計數器

[英]Add to Scaffold Appbar a click counter with multiple pages

您好,我正在使用導航器和路線創建具有多個頁面的應用程序。 我想向 Scaffold Appbar 添加一個計數器,每次手指點擊屏幕按鈕時都會增加一個計數器(如果它們在頁面中出現的按鈕不止一個)。 此外,如果我更改頁面,此計數器必須增加。 你能幫我理解這個問題嗎? 我正在學習,因此該結構可能是“初學者”版本。 謝謝。

您可能可以將一些日志記錄掛接到 PageRouteBuilder,因為每條路由都從給定頁面經過那里(當然,它也必須在每個頁面上)。

正如@Randal Schwartz 評論的那樣,我們可以利用MaterialApp class 的onGenerateRoute屬性:

runApp(MaterialApp(
        home: BuilderPage(LoginArguments(false)),
        onGenerateRoute: generateRoute
));

通過定義自定義generateRoute function:

int counter = 0; // global variable outside of the classes

Route<dynamic> generateRoute(RouteSettings settings) {
  switch (settings.name) {
    case 'home':
      counter++;
      return MaterialPageRoute(builder: (_) => HomeScreen());
    case 'login':
      counter++;
      return MaterialPageRoute(builder: (_) => LoginScreen());
    case 'register':
      counter++;
      return MaterialPageRoute(builder: (_) => RegisterScreen());
  }
}

然后Widget可以通過將counter加載到它們的 state 中來顯示計數器:

class HomeScreen extends StatefulWidget {
  const HomeScreen({ Key key }) : super(key: key);

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

class _HomeScreenState extends State<HomeScreen> {

  int _counter;

  @override
  void initState() {
    super.initState();
    setState(() => _counter = counter);
  }

  void _increaseCounter() {
     counter++;
     setState(() => _counter++);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
       appBar: AppBar(child: Text(_counter.toString())),
       body: SafeArea(
               child: Center(child: 
                  GestureDetector(
                     onTap: () { _increaseCounter(); }, 
                     child: Text('test'),
                 ),
              ),
           ),
       ),
    );
  }
}

注意:這個解決方案不是最優的。 請務必考慮更高級的 state 管理架構,例如BLoC ,以更好地管理應用程序中不同Widget之間的數據同步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM