اذهب إلى المحتوى

السؤال

نشر

كيف يمكن عمل مشاركة لصفحة فلاتر مع محتوياتها مثلا

الصوره + العنوان المتواجد فيها الى تطبيقات مختلفه بحيث يصل رابط الى المستخدم الثاني + صوره + العنوان ولو ضغط على الرابط يتحول الى التطبيق ولو ما منزل التطبيق لديه يتحول الى المتجر  

ياليت اذا احد مطبق الفكره من قبل يشارك الكود معنا لفعل ذلك

Recommended Posts

  • 1
نشر
بتاريخ 18 ساعات قال مروان مروان3:

ولو ضغط على الرابط يتحول الى التطبيق ولو ما منزل التطبيق لديه يتحول الى المتجر 

بالنسبة لهذا الجزئية بالتحديد، أعتقد أنك تقصد تقنية Deep Link حيث يتم وضع رابط ما في موقع الكتروني أو إعلان و عند النقر عليه يتم فتح التطبيق على الصفحة المختارة مسبقا، أو التوجه للمتجر play store. للأسف أنا لم استخدمها مسبقا ولكن يمكنك مراجعة التوثيق من الصفحة الرسمية: flutter.dev deep-linking.

وباستعمال مكتبة uni_links يمكن استقبال حدث الوجيه (المشاركة) ومن ثم فتح الصفحة المناسبة.

يمكنك البحث أكثر من:

  • How to handle deep-linking to a Flutter App

  • Deep Links and Flutter applications. How to handle them properly.

  • 1
نشر

يمكنك استخدام share من هنا. في تطبيقك ويمكنك استخدام 

Share.share('check out my website https://example.com');

تأخذ Share أيضًا موضوعًا اختياريًا سيتم استخدامه عند المشاركة في البريد الإلكتروني.

Share.share('check out my website https://example.com', subject: 'Look what I made!');

لمشاركة ملف واحد أو عدة ملفات ، قم باستدعاء طريقة shareFiles الثابتة في أي مكان في رمز Dart الخاص بك. اختياريًا يمكنك أيضًا تمرير النص والموضوع.

Share.shareFiles(['${directory.path}/image.jpg'], text: 'Great picture');
Share.shareFiles(['${directory.path}/image1.jpg', '${directory.path}/image2.jpg']);

ومن خلال الكود الكامل 

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:share/share.dart';

import 'image_previews.dart';

void main() {
  runApp(DemoApp());
}

class DemoApp extends StatefulWidget {
  @override
  DemoAppState createState() => DemoAppState();
}

class DemoAppState extends State<DemoApp> {
  String text = '';
  String subject = '';
  List<String> imagePaths = [];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Share Plugin Demo',
      home: Scaffold(
          appBar: AppBar(
            title: const Text('Share Plugin Demo'),
          ),
          body: SingleChildScrollView(
            child: Padding(
              padding: const EdgeInsets.all(24.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  TextField(
                    decoration: const InputDecoration(
                      labelText: 'Share text:',
                      hintText: 'Enter some text and/or link to share',
                    ),
                    maxLines: 2,
                    onChanged: (String value) => setState(() {
                      text = value;
                    }),
                  ),
                  TextField(
                    decoration: const InputDecoration(
                      labelText: 'Share subject:',
                      hintText: 'Enter subject to share (optional)',
                    ),
                    maxLines: 2,
                    onChanged: (String value) => setState(() {
                      subject = value;
                    }),
                  ),
                  const Padding(padding: EdgeInsets.only(top: 12.0)),
                  ImagePreviews(imagePaths, onDelete: _onDeleteImage),
                  ListTile(
                    leading: Icon(Icons.add),
                    title: Text("Add image"),
                    onTap: () async {
                      final imagePicker = ImagePicker();
                      final pickedFile = await imagePicker.getImage(
                        source: ImageSource.gallery,
                      );
                      if (pickedFile != null) {
                        setState(() {
                          imagePaths.add(pickedFile.path);
                        });
                      }
                    },
                  ),
                  const Padding(padding: EdgeInsets.only(top: 12.0)),
                  Builder(
                    builder: (BuildContext context) {
                      return ElevatedButton(
                        child: const Text('Share'),
                        onPressed: text.isEmpty && imagePaths.isEmpty
                            ? null
                            : () => _onShare(context),
                      );
                    },
                  ),
                  const Padding(padding: EdgeInsets.only(top: 12.0)),
                  Builder(
                    builder: (BuildContext context) {
                      return ElevatedButton(
                        child: const Text('Share With Empty Origin'),
                        onPressed: () => _onShareWithEmptyOrigin(context),
                      );
                    },
                  ),
                ],
              ),
            ),
          )),
    );
  }

  _onDeleteImage(int position) {
    setState(() {
      imagePaths.removeAt(position);
    });
  }

  _onShare(BuildContext context) async {
    // A builder is used to retrieve the context immediately
    // surrounding the ElevatedButton.
    //
    // The context's `findRenderObject` returns the first
    // RenderObject in its descendent tree when it's not
    // a RenderObjectWidget. The ElevatedButton's RenderObject
    // has its position and size after it's built.
    final RenderBox box = context.findRenderObject() as RenderBox;

    if (imagePaths.isNotEmpty) {
      await Share.shareFiles(imagePaths,
          text: text,
          subject: subject,
          sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size);
    } else {
      await Share.share(text,
          subject: subject,
          sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size);
    }
  }

  _onShareWithEmptyOrigin(BuildContext context) async {
    await Share.share("text");
  }
}

 

  • 0
نشر (معدل)
بتاريخ 10 ساعات قال Wael Aljamal:

بالنسبة لهذا الجزئية بالتحديد، أعتقد أنك تقصد تقنية Deep Link حيث يتم وضع رابط ما في موقع الكتروني أو إعلان و عند النقر عليه يتم فتح التطبيق على الصفحة المختارة مسبقا، أو التوجه للمتجر play store. للأسف أنا لم استخدمها مسبقا ولكن يمكنك مراجعة التوثيق من الصفحة الرسمية: flutter.dev deep-linking.

وباستعمال مكتبة uni_links يمكن استقبال حدث الوجيه (المشاركة) ومن ثم فتح الصفحة المناسبة.

يمكنك البحث أكثر من:

  • How to handle deep-linking to a Flutter App

  • Deep Links and Flutter applications. How to handle them properly.

اهلا بك اخي الكريم

شاكر لك افادتك فعلا هذا ما كنت ابحث عنه بنسبه الى الباكيج الذي قمت بمشاركته انت معي يبدو الامر متعبا قليلا وطويل نوعا ما 

توجد طريقة اسهل للفائده عن طريق الفاير بيز وهذا الباكج الخاص بها كثير يوجد لها شروحات في الانترنت اليوتيوب وما شابه 

firebase_dynamic_links: ^2.0.2

 

 

مودتي لك

بتاريخ On 28‏/4‏/2021 at 23:46 قال بلال زيادة:

يمكنك استخدام share من هنا. في تطبيقك ويمكنك استخدام 


Share.share('check out my website https://example.com');

تأخذ Share أيضًا موضوعًا اختياريًا سيتم استخدامه عند المشاركة في البريد الإلكتروني.


Share.share('check out my website https://example.com', subject: 'Look what I made!');

لمشاركة ملف واحد أو عدة ملفات ، قم باستدعاء طريقة shareFiles الثابتة في أي مكان في رمز Dart الخاص بك. اختياريًا يمكنك أيضًا تمرير النص والموضوع.


Share.shareFiles(['${directory.path}/image.jpg'], text: 'Great picture');
Share.shareFiles(['${directory.path}/image1.jpg', '${directory.path}/image2.jpg']);

ومن خلال الكود الكامل 


import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:share/share.dart';

import 'image_previews.dart';

void main() {
  runApp(DemoApp());
}

class DemoApp extends StatefulWidget {
  @override
  DemoAppState createState() => DemoAppState();
}

class DemoAppState extends State<DemoApp> {
  String text = '';
  String subject = '';
  List<String> imagePaths = [];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Share Plugin Demo',
      home: Scaffold(
          appBar: AppBar(
            title: const Text('Share Plugin Demo'),
          ),
          body: SingleChildScrollView(
            child: Padding(
              padding: const EdgeInsets.all(24.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  TextField(
                    decoration: const InputDecoration(
                      labelText: 'Share text:',
                      hintText: 'Enter some text and/or link to share',
                    ),
                    maxLines: 2,
                    onChanged: (String value) => setState(() {
                      text = value;
                    }),
                  ),
                  TextField(
                    decoration: const InputDecoration(
                      labelText: 'Share subject:',
                      hintText: 'Enter subject to share (optional)',
                    ),
                    maxLines: 2,
                    onChanged: (String value) => setState(() {
                      subject = value;
                    }),
                  ),
                  const Padding(padding: EdgeInsets.only(top: 12.0)),
                  ImagePreviews(imagePaths, onDelete: _onDeleteImage),
                  ListTile(
                    leading: Icon(Icons.add),
                    title: Text("Add image"),
                    onTap: () async {
                      final imagePicker = ImagePicker();
                      final pickedFile = await imagePicker.getImage(
                        source: ImageSource.gallery,
                      );
                      if (pickedFile != null) {
                        setState(() {
                          imagePaths.add(pickedFile.path);
                        });
                      }
                    },
                  ),
                  const Padding(padding: EdgeInsets.only(top: 12.0)),
                  Builder(
                    builder: (BuildContext context) {
                      return ElevatedButton(
                        child: const Text('Share'),
                        onPressed: text.isEmpty && imagePaths.isEmpty
                            ? null
                            : () => _onShare(context),
                      );
                    },
                  ),
                  const Padding(padding: EdgeInsets.only(top: 12.0)),
                  Builder(
                    builder: (BuildContext context) {
                      return ElevatedButton(
                        child: const Text('Share With Empty Origin'),
                        onPressed: () => _onShareWithEmptyOrigin(context),
                      );
                    },
                  ),
                ],
              ),
            ),
          )),
    );
  }

  _onDeleteImage(int position) {
    setState(() {
      imagePaths.removeAt(position);
    });
  }

  _onShare(BuildContext context) async {
    // A builder is used to retrieve the context immediately
    // surrounding the ElevatedButton.
    //
    // The context's `findRenderObject` returns the first
    // RenderObject in its descendent tree when it's not
    // a RenderObjectWidget. The ElevatedButton's RenderObject
    // has its position and size after it's built.
    final RenderBox box = context.findRenderObject() as RenderBox;

    if (imagePaths.isNotEmpty) {
      await Share.shareFiles(imagePaths,
          text: text,
          subject: subject,
          sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size);
    } else {
      await Share.share(text,
          subject: subject,
          sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size);
    }
  }

  _onShareWithEmptyOrigin(BuildContext context) async {
    await Share.share("text");
  }
}

 

اهلا بك اخي الكريم

بنسبه للي كنت اقصده هو مشاركة الصفحه كامل بحيث الرابط يستطيع المستخدم النقر عليه والانتقال الى تطبيقي 

اما الطريقة التي ذكرتها انت تنفع لمشاركة رابط التطبيق مثلا ولكن لمشاركة الصفحه لا اعلم اذا كان يمكن استعمالها 

 

للفائده توجد باكج للفايز بيز تقوم بهذا العمل 

firebase_dynamic_links: ^2.0.2

مودتي لك الغالي

تم التعديل في بواسطة مروان مروان3

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...