te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>Flutter: Try to focus and show selected Button in screen (within horizontal Listview) till another one is selected - Stack Overf
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Flutter: Try to focus and show selected Button in screen (within horizontal Listview) till another one is selected - Stack Overf

programmeradmin4浏览0评论

I have the following initial situation. A list with buttons in a horizontal order. When I select a button, data is loaded from Firestore with a Stream Builder and displayed below the button list (EventsSection). In EventsSection class I also load data from Firestore using the passed parameter OrgaId (selectedIndex). The problem I have right now is that when I select a button, the entire page is reloaded because of the setState method. The view goes back to the first button. However, I want the selected button to be focused and keep being displayed until another one is selected. What is the best way to solve this?

I tried to scroll to the selected position with a WidgetsBinding.instance.addPostFrameCallback() Unfortunately, this does not work currently.

class MyPage extends StatefulWidget {
  const MyPage({super.key});

  @override
  State<StatefulWidget> createState() => _MyPageState();
}

class _MyPageState extends State<MyPage> {
  int selectedIndex = 1;
  late ScrollController _scrollController;

  @override
  void initState() {
    _scrollController = ScrollController();
    super.initState();
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
    ]);
  }

  @override
  void dispose() {
    _scrollController.dispose();
    super.dispose();
  }

  void updateOrganizationIndex(String id) {
    int newIndex = int.parse(id);

    setState(() {
      selectedIndex = newIndex;
    });

    WidgetsBinding.instance.addPostFrameCallback((_) {
      if (_scrollController.hasClients) {
        double offset = newIndex * 120.0;

        _scrollController.jumpTo(offset);
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    final Color primaryColor = Theme.of(context).primaryColor;

    final Stream<QuerySnapshot> anizationStream = FirebaseFirestore.instance
        .collection('anizations')
        .where('category', isEqualTo: CategoryType.testcategory.stringValue)
        .snapshots();

    return SingleChildScrollView(
      scrollDirection: Axis.vertical,
      child: Column(
        children: [
          StreamBuilder(
              stream: anizationStream,
              builder: (BuildContext context,
                  AsyncSnapshot<QuerySnapshot> snapshot) {
                if (snapshot.hasError) {
                  return SizedBox.shrink();
                }

                if (snapshot.connectionState == ConnectionState.waiting) {
                  return SizedBox.shrink();
                }

                if (snapshot.data!.docs.length == 1) {
                  selectedIndex = int.parse(snapshot.data!.docs[0].id);
                  return SizedBox.shrink();
                }

                return ListView.builder(
                  controller: _scrollController,
                  scrollDirection: Axis.horizontal,
                  padding: EdgeInsets.only(left: 10),
                  itemCount: snapshot.data!.docs.length,
                  itemBuilder: (context, index) {
                    DocumentSnapshot document = snapshot.data!.docs[index];
                    Map<String, dynamic> data =
                        document.data()! as Map<String, dynamic>;
                    return Row(
                      children: [
                        ElevatedButton(
                          onPressed: () => updateOrganizationIndex(document.id),
                          style: selectedIndex == int.parse(document.id)
                              ? ElevatedButton.styleFrom(
                                  backgroundColor: primaryColor,
                                  shape: const RoundedRectangleBorder(
                                    borderRadius: BorderRadius.all(
                                      Radius.circular(8),
                                    ),
                                  ),
                                )
                              : ElevatedButton.styleFrom(
                                  backgroundColor: Colors.transparent,
                                  elevation: 0,
                                  shape: const RoundedRectangleBorder(
                                    side: BorderSide(
                                      color: Color.fromARGB(58, 58, 58, 1),
                                    ),
                                    borderRadius: BorderRadius.all(
                                      Radius.circular(8),
                                    ),
                                  ),
                                ),
                          child: Text(
                            data['name'],
                            style: selectedIndex == int.parse(document.id)
                                ? TextStyle(color: Colors.black)
                                : TextStyle(color: Colors.white),
                          ),
                        ),
                        SizedBox(width: 10),
                      ],
                    );
                  },
                );
              }),
          SizedBox(height: 20),
          EventsSection(
            aId: selectedIndex,
            upcoming: true,
          ),
        ],
      ),
    );
  }
}

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论